我已经检查了foldl
函数的签名,这是结果:
> :t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
我对这部分代码 t a ->b
感到困惑,这部分是什么意思?
我的猜想是它表示 foldl
函数的第三个参数是一个包含类型为 a
的元素的 Foldable
数据结构,我的猜测正确吗?
是的。t
是 Foldable
类型类的成员,因此它可以对 a
中的元素进行折叠。
例如,如果 t
是 t ~ []
,则签名为:
foldl :: (b -> a -> b) -> b -> [] a -> b
foldl :: (b -> a -> b) -> b -> [a] -> b
t
可以是另一个类似于 Maybe
、Tree
、Either c
的 Foldable
。因此我们可以在这样的数据结构上使用 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