Functor和monad类
班 莫纳德米哪里来源
这个莫纳德
类定义对莫纳德,数学分支中的一个概念范畴理论.然而,从Haskell程序员的角度来看,最好把单子想象成抽象数据类型共个操作。哈斯克尔的做
表达式为书写提供了方便的语法一元表达式。
最小完整定义:>>=
和返回
.
的实例莫纳德
应满足以下法律:
返回a>>=k==k am>>=返回==mm>>=(\x->k x>>=h)==(m>>=k)>>=小时
两者的实例莫纳德
和Functor(仿真器)
还应满足法律要求:
fmap f xs==xs>>=return。(f)
的实例莫纳德
对于列表,也许 吧
和IO(输入输出)
定义在前奏曲满足这些法律。
方法
(>>=)::对于所有人a b.m a->(a->m b)->m b来源
按顺序组合两个操作,传递产生的任何值以第一个作为第二个的论据。
(>>)::对于所有人a b.m a->m b->m b来源
按顺序组合两个操作,丢弃产生的任何值由第一个类似的排序运算符(如分号)命令式语言。
返回::a->m a来源
失败::字符串->百万来源
失败并显示消息。此操作不是monad的数学定义,但在pattern-match上调用中的故障做
表达式。
功能
命名约定
此库中的函数使用以下命名约定:
- 后缀
M(M)
“总是代表Kleisli类别中的函数:monad类型构造函数米
添加到函数结果中(模数咖喱),别无他法。例如,
过滤器::(a->Bool)->[a]->[a]过滤器m::(单子m)=>(a->m Bool)->[a]->m[a]
- 后缀
_
'将结果类型从更改为(百万)
到(米())
.因此,例如:
序列:单子m=>[ma]->m[a]sequence_::莫纳德m=>[m a]->m()
sum::数字a=>[a]->amsum::MonadPlus m=>[ma]->ma
基本莫纳德
功能
(<=<)::莫纳德m=>(b->m c)->(a->m b)->a->m c来源
单子体从右到左的克莱斯利构图。(>=>
)
,参数翻转
列表函数概述
参加::莫纳德m=>m(毫安)->毫安来源
这个参加
函数是传统的monad连接操作符。它用于删除一级的一元结构,将其绑定参数投影到外部水平。
映射并解压缩M::莫纳德m=>(a->m(b,c))->[a]->m([b],[c])来源
这个映射并解压缩M
函数将其第一个参数映射到列表上,返回结果为一对列表。此功能主要用于复杂数据结构或状态转换单体。
foldM(折叠M)::莫纳德m=>(a->b->ma)->a->[b]->ma来源
这个foldM(折叠M)
函数类似于折叠
,但其结果是封装在单子里。请注意foldM(折叠M)
从左到右工作列表参数。这可能是一个问题(>>
)
和折叠的函数“不是可交换的。
foldM f a1[x1,x2,…,xm]
==
做a2<-f a1 x1a3<-f a2x2...f上午xm
如果需要从右向左评估,则应反转输入列表。
一元表达式的条件执行
什么时候::莫纳德m=>布尔->米()->米()来源
一元表达式的条件执行。例如,
调试时(putStr“Debugging\n”)
将输出字符串正在调试\n
如果布尔值调试
是真的
,否则什么也不做。
单体起重操作员
提升M2::莫纳德m=>(a1->a2->r)->m a1->m a2->m r来源
将函数升级为单子函数,扫描中的单子参数从左到右。例如,
提升M2(+)[0,1][0,2]=[0,2,1,3]liftM2(+)(仅1)无=无
提升M3::莫纳德m=>(a1->a2->a3->r)->m a1->m a2->m a3->m r来源
将函数升级为单子函数,扫描中的单子参数从左到右(参见。提升M2
).
提升M4::莫纳德m=>(a1->a2->a3->a4->r)->m a1->m a2->m a3->m a4->m r来源
将函数升级为monad,扫描从左到右(参见。提升M2
).
提升M5::莫纳德m=>(a1->a2->a3->a4->a5->r)->m a1->m a2->m a3->m a4->m a5->m r来源
将函数升级为单子函数,扫描中的单子参数从左到右(参见。提升M2
).
应用程序::莫纳德m=>m(a->b)->m a->m b来源
在许多情况下提升M
操作可以替换为使用应用程序
,促进功能应用。
返回f`ap`x1`ap``ap `xn
等于
提升Mn f x1 x2。。。x个