我有一门关于函数式编程的大学类(class),我在那里使用 SML。作为考试的准备,我正在研究一些没有解决方案的较旧的考试集。
我真正有问题的唯一问题之一是使用 foldl
的以下问题:
我相信这真的很容易,但我很难理解 foldl 和 foldr 函数。
我现在拥有的是以下内容(如果你问我的编译器,这似乎是非常错误的!):
fun addGt(k,xs) = List.foldl ( fn x => if x > k then op+ else 0) 0 xs;
我真的很感激这个问题的一些帮助,也许是一个非常简短的评论,可以对 foldl
和 foldr
函数有所了解! 最佳答案
我刚刚想到的一个解决方案如下:
fun addGt(k, xs) = List.foldl (fn (x, y) => if x >= 5 then x + y else y) 0 xs;
但让我解释一下。首先检查
List.foldl
函数的类型,它是:('a * 'b -> 'b) -> 'b -> 'a list -> 'b
所以
List.foldl
是一个 curried 函数,它将另一个 ('a * 'b -> 'b)
类型的函数作为第一个参数。您使用了类型为 (fn x => if x > k then op+ else 0)
的 int -> int
。您应该改为为 List.foldl
提供一个函数,该函数采用 int * int
类型的元组并返回 int
,因此类似于: (fn (x, y) => do stuff)
。这就是为什么你的代码没有编译,你在 foldl
中传递了错误类型的函数。现在你可以这样想
foldl
:foldl f b [x_1, x_2, ..., x_(n - 1), x_n] = f(x_n, f(x_(n - 1), ..., f(x2, f(x1, b)) ...))
其中 f
是 ('a * 'b -> 'b)
类型的函数,b
是 'b
类型,列表 [x_1, x_2, ..., x_(n - 1), x_n]
是 'a list
类型。与
foldr
类似,您可以这样思考:foldr f b [x_1, x_2, ..., x_(n - 1), x_n] = f(x_1, f(x_2, ..., f(x_(n - 1), f(x_ n, b))
关于functional-programming - 如何在有条件的列表上添加?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5963282/