我知道 foldr 可用于在列表[1,2,3,4]上定义长度函数,如下所示:
ghci > foldr (\x y -> 1 + y) 0 [1,2,3,4]
它的工作原理如下:
Starting accumulator = 0
1 + 0 = 1
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
Answer = 4
但我不确定为什么等效的 foldl 函数的计算结果为5而不是4:
ghci > foldl (\x y -> 1 + y) 0 [1,2,3,4]
我认为它是如何起作用的暗示:
Starting accumulator = 0 (not used)
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
1 + 4 = 5
Answer = 5
答案 0 :(得分:6)
提示:
> foldl (\x y -> 1 + y) 0 [1,2,3,400]
401
另请注意,这两种函数类型以不同的顺序接受参数:
> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
^^^^^^^^^^^^^
> :t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
^^^^^^^^^^^^^
答案 1 :(得分:0)
如果您实际定义了长度函数(称之为length'
或其他东西)并使用:t length'
向GHCi询问其类型,您会发现它没有您期望的类型。如果使用正确的类型签名length' :: Foldable f => f a -> Int
定义它,则类型错误应该会提示您做错了什么。