Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何将函数的重复应用累积到值列表?_List_Haskell - Fatal编程技术网

List 如何将函数的重复应用累积到值列表?

List 如何将函数的重复应用累积到值列表?,list,haskell,List,Haskell,如何将函数的连续应用累积到Haskell中的值列表中 我不确定我的措辞是否正确,但我要寻找的是,例如,我有一个X类型的列表值 l = [a, b, c, d, e] 和一个函数 f :: X -> X -> X 我想要 (f e (f d (f c (f b a)))) 我认为可以用$来表达 我看到Haskell有一些折叠功能,但我不太明白如何让它像那样工作。这不就是foldl1(flip f)l?您需要左折叠,并且希望操作从列表中的第一项开始,而不是从特定的累加器开始。这不就

如何将函数的连续应用累积到Haskell中的值列表中

我不确定我的措辞是否正确,但我要寻找的是,例如,我有一个
X
类型的列表值

l = [a, b, c, d, e]
和一个函数

f :: X -> X -> X
我想要

(f e (f d (f c (f b a))))
我认为可以用
$
来表达


我看到Haskell有一些
折叠功能,但我不太明白如何让它像那样工作。

这不就是
foldl1(flip f)l
?您需要左折叠,并且希望操作从列表中的第一项开始,而不是从特定的累加器开始。

这不就是
foldl1(flip f)l
?您需要左折叠,并且希望操作从列表中的第一项开始,而不是从特定的累加器开始。

嗯,您的函数
f
确实具有以下类型:

f :: X -> X -> X
那么您感兴趣的表达式是:

foldr1 f [e, d, c, a, b]  -- note the twist at the end.
如果要计算:

f e (f d (f c (f b a)))  -- note last term is: f b a
那么它只是:

foldr1 f [e, d, c, b, a]

那么,您的函数
f
确实具有以下类型:

f :: X -> X -> X
那么您感兴趣的表达式是:

foldr1 f [e, d, c, a, b]  -- note the twist at the end.
如果要计算:

f e (f d (f c (f b a)))  -- note last term is: f b a
那么它只是:

foldr1 f [e, d, c, b, a]
玩游戏来解决它

ghci> import Debug.SimpleReflect
ghci> foldl1 f [a,b,c,d,e]
f (f (f (f a b) c) d) e
ghci> foldl (flip f) z [a,b,c,d,e]
f e (f d (f c (f b (f a z))))
诸如此类……

玩一玩就知道了

ghci> import Debug.SimpleReflect
ghci> foldl1 f [a,b,c,d,e]
f (f (f (f a b) c) d) e
ghci> foldl (flip f) z [a,b,c,d,e]
f e (f d (f c (f b (f a z))))

等等……

如果列表为空或只有一个元素,您希望发生什么。您的意思是要编写
f b a
?这类问题的一个良好起点是(实际上haskell中的任何内容)仔细考虑您想要的类型签名。如果你不会写签名,那么你就不知道你想要什么。然后你可能会把它输入hoogle,发现它已经被写了。你是说要用
d
两次吗?@dfeuer:是的,我真的把问题搞糟了!如果列表为空或只有一个元素,您希望发生什么情况。您的意思是要编写
f b a
?对于此类问题(以及haskell中的所有问题),一个很好的起点是仔细考虑您想要的类型签名。如果你不会写签名,那么你就不知道你想要什么。然后你可能会把它输入hoogle,发现它已经被写了。你是说要用
d
两次吗?@dfeuer:是的,我真的把问题搞糟了!哇,我不知道我能做到。这使得学习Haskell变得简单多了!(“教一个人钓鱼…”哇,我不知道我能做到。这使得学习Haskell变得简单多了!(“教人钓鱼……”