【问题标题】:Alternating Sum Using FOLDR (SML)使用 FOLDR (SML) 交替求和
【发布时间】:2015-07-28 23:38:45
【问题描述】:

我正在尝试使用foldrint 列表中获取交替总和,但不断收到运算符/操作数不匹配错误。我有种不完全理解的感觉foldr

l = [1,3,5,7,9]
foldr (op-) l

我希望输出是

1 - 3 + 5 - 7 + 9 = 5

编辑:

我实际上被要求使用foldr 的匿名函数

所以,例如

l = [1,3,5,7,9]
foldr (fn (x, y): => x - y) l

具有相同的预期输出,但我仍然得到相同的操作数/运算符不匹配

【问题讨论】:

  • 检查foldr的类型。

标签: list sml fold


【解决方案1】:

foldr(以及foldl)取一个初始值。

foldr的类型是('a * 'b -> 'b) -> 'b -> 'a list -> 'b,其中'b是折叠中每一步的结果的类型(以及初始值,也就是初始的“结果”); 'a 是列表中元素的类型。请注意,'a'b 可以不同。组合函数接受一个元素和一个先前的结果并返回新的结果。

无论如何,您需要考虑一个合适的初始值。应该是什么?我认为 0 可以:

foldr op- 0 l

【讨论】:

  • 如果 OP 需要使用匿名函数,它应该是 foldr (fn (x,y) => x - y) 0 但显然 (op-) 更好。
  • 0 有什么作用?
  • @Delfini:也许你应该看看foldr 的文档,或者阅读en.wikipedia.org/wiki/Fold_%28higher-order_function%29
  • 谢谢!这有帮助:)
【解决方案2】:

仅使用List.foldl 函数的解决方案如下。

fun altSum ls = if (List.foldl op+ 0 (map (fn x => 1) ls)) mod 2 = 0 
                then ~1 * (List.foldl (fn (x, y) => y - x) 0 ls)
                else List.foldl (fn (x, y) => y - x) 0 ls

你可以看到为什么这有效here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2016-02-02
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多