Functional programming 如何在有条件的列表上进行添加?
我有一门关于函数式编程的大学课程,在那里我使用SML。为了准备考试,我正在做一些没有答案的旧考试 我真正有问题的唯一一个问题是使用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函数 我现在有以下内容(如果你问我的编译器,这似乎是非常错误
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) => ...