我有一门关于函数式编程的大学类(class),我在那里使用 SML。作为考试的准备,我正在研究一些没有解决方案的较旧的考试集。
我真正有问题的唯一问题之一是使用 foldl 的以下问题:

我相信这真的很容易,但我很难理解 foldl 和 foldr 函数。
我现在拥有的是以下内容(如果你问我的编译器,这似乎是非常错误的!):

fun addGt(k,xs) = List.foldl ( fn x => if x > k then op+ else 0) 0 xs;
我真的很感激这个问题的一些帮助,也许是一个非常简短的评论,可以对 foldlfoldr 函数有所了解!

最佳答案

我刚刚想到的一个解决方案如下:

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/

10-10 20:15