Functional programming 如何在有条件的列表上进行添加?

Functional programming 如何在有条件的列表上进行添加?,functional-programming,sml,higher-order-functions,fold,Functional Programming,Sml,Higher Order Functions,Fold,我有一门关于函数式编程的大学课程,在那里我使用SML。为了准备考试,我正在做一些没有答案的旧考试 我真正有问题的唯一一个问题是使用foldl: 以程序框架为例:有趣 addGt k xs=List.foldl(…)。。。xs; 补上缺的两块 (由点表示…),以便 addGt k xs是这些参数的总和 xs中大于的元素 K例如,addGt 4[1,5,2,7, 4,8]=5+7+8=20 我相信这很容易,但我很难理解foldl和foldr函数 我现在有以下内容(如果你问我的编译器,这似乎是非常错误

我有一门关于函数式编程的大学课程,在那里我使用SML。为了准备考试,我正在做一些没有答案的旧考试

我真正有问题的唯一一个问题是使用
foldl

以程序框架为例:有趣 addGt k xs=List.foldl(…)。。。xs; 补上缺的两块 (由点表示…),以便 addGt k xs是这些参数的总和 xs中大于的元素 K例如,addGt 4[1,5,2,7, 4,8]=5+7+8=20

我相信这很容易,但我很难理解foldl和foldr函数

我现在有以下内容(如果你问我的编译器,这似乎是非常错误的!):


我非常感谢您对这个问题的帮助,也许还可以发表一条简短的评论,让我了解一下
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
是一个函数,它将另一个
('a*'b->'b)
类型的函数作为第一个参数。您使用了
(fnx=>如果x>k,那么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代码>是类型

与foldr类似,您可以这样想:


foldrfb[x_1,x_2,…,x_(n-1),x_n]=f(x_1,f(x_2,…,f(x_(n-1),f(x_n,b))
如果在列表中调用
foldlfs ls
ls=[x1,x2,…,xn]
,则得到结果:

f(xn, ... f(x2, f(x1, s)))
也就是说,它从发现

a1 = f(x1, s)
然后

依此类推,直到它被列入清单

完成后,它将返回
an

您可以将
a
-值视为一种累加器,也就是说,
ai
是列表仅为
[x1,x2,…,xi]
时的结果(或者更确切地说,是列表的第一个i元素)

您的函数通常具有以下形式:

fn (x, a) => ...

你需要做的是:如果我有列表中的下一个元素,代码< > x(i + 1)< /> >,值>代码> Ai/Cube >,这是列表<代码> [X1,X2,…,XI] < /C>的结果,我需要做什么来找到值<代码>(i + 1)< /C> >,这是列表<代码> [x1,x2,…,席席,x(i+1)] < /COD> < /P>的结果。

s
可以被认为是给空列表的值


foldr
的工作原理是一样的,只是你从列表的后面开始,而不是从前面开始。

非常感谢你的解释!:-)非常感谢你的解释和回答!:-)我想你的意思是
如果x>=k
a2 = f(x2, a1)
fn (x, a) => ...