当我发现这真的困扰我时,我正在玩Haskell和ghci:
foldl (++) [[3,4,5], [2,3,4], [2,1,1]] []
Run Code Online (Sandbox Code Playgroud)
我希望得到这个:[3,4,5,2,3,4,2,1,1]
然而它得到:
[[3,4,5],[2,3,4],[2,1,1]]
Run Code Online (Sandbox Code Playgroud)
据我所知,foldl应该是这样的:
(([] ++ [3, 4, 5]) ++ [2, 3, 4]) ++ [2, 1, 1]
Run Code Online (Sandbox Code Playgroud)
如果我在ghci中键入它,它确实是[3,4,5,2,3,4,2,1,1].
而另一个奇怪的是:
Prelude> foldl1 (++) [[3,4,5], [2, 3, 4], [2, 1, 1]]
[3,4,5,2,3,4,2,1,1]
Run Code Online (Sandbox Code Playgroud)
我希望foldl和foldl1的行为方式相同.那么foldl实际上做了什么?
ada*_*max 20
参数的顺序是错误的.正确的是:(
foldl (++) [] [[3,4,5], [2,3,4], [2,1,1]]
即,首先是累加器,然后是列表.)
你改变了争论.foldl首先获取累加器的起始值,然后将列表折叠起来.那么在你的情况下会发生的事情就是foldl折叠空列表,从而返回起始值,即[[3,4,5], [2, 3, 4], [2, 1, 1]].这将做你想要的:
foldl (++) [] [[3,4,5], [2, 3, 4], [2, 1, 1]]
Run Code Online (Sandbox Code Playgroud)