首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有“`Foldable`”类型约束的折叠类型签名

具有“`Foldable`”类型约束的折叠类型签名
EN

Stack Overflow用户
提问于 2018-03-01 19:44:30
回答 1查看 523关注 0票数 2

在我的GHCi foldrfoldl上有这样的签名:

代码语言:javascript
复制
Prelude> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Prelude> :t foldl
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b

折叠的替代类型签名(特别是t a部件)之间有什么区别?

代码语言:javascript
复制
fr :: (a -> b -> b) -> b -> [a] -> b
fl :: (b -> a -> b) -> b -> [a] -> b
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 20:06:00

类型类Foldable除了定义foldl之外,还定义了许多函数。

代码语言:javascript
复制
class Foldable t where
    foldMap :: Monoid m => t m -> m
    foldr :: (a -> b -> b) -> b -> t a -> b
    foldl :: (b -> a -> b) -> b -> t a -> b
    -- ...

通过至少为类型定义Foldablefoldr,可以为类型构造函数t定义foldMap实例。(foldl在其他一些方面有一个默认定义,所以只要提供最低定义,就可以“免费”获得它)。

代码语言:javascript
复制
instance Foldable [] where
    foldr f b [] = b
    foldr f b (x:xs) = f x : foldr f b xs

instance Foldable Maybe where
    foldr f b Nothing = b
    foldr f b (Just a) = f b a

类型签名中的t只是意味着,只要类型构造函数有定义它的Foldable实例,就可以使用具有适当类型的值的foldl。例如:

代码语言:javascript
复制
Prelude> foldl (+) 0 [1,2,3]
6
Prelude> foldl (+) 0 []
0
Prelude> foldl (+) 0 Nothing
0
Prelude> foldl (+) 0 (Just 3)
3

在前两种情况中,我们使用[]实例,因为与t a对应的参数是列表,这意味着t[] (书面t ~ [] )是统一的。在第二个例子中,我们使用Maybe实例,因为与t a对应的参数是Maybe值,因此是t ~ Maybe

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49057524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档