问题描述
我检查了 foldl
函数的签名,结果如下:
> :t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
我对这部分感到困惑t a ->b
这部分是什么意思?
我的猜测是否正确,这意味着 foldl
函数的第三个参数是一个 Foldable
数据结构,其中包含类型为 a
的元素?
解决方法
是即可。 t
是Foldable
类型类中的一员,而且我们因此有过的a
。
如果例如t
是t ~ []
,则签名是:
foldl :: (b -> a -> b) -> b -> [] a -> b
以下规范:
foldl :: (b -> a -> b) -> b -> [a] -> b
但是,t
可以是另一Foldable
像Maybe
,Tree
,Either c
,等。因此,我们可以使用Foldl
这样结构:
foldl :: (b -> a -> b) -> b -> [a] -> b
foldl :: (b -> a -> b) -> b -> Maybe a -> b
foldl :: (b -> a -> b) -> b -> Tree a -> b
foldl :: (b -> a -> b) -> b -> Either c a -> b