在定义长度

时间:2016-04-13 20:05:33

标签: haskell

我知道 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

2 个答案:

答案 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定义它,则类型错误应该会提示您做错了什么。