base-4.6.0.0:基本库

便携性便携式的
稳定性临时的,临时的
维护人员librarys@haskell.org
安全哈斯克尔值得信赖的

控制。莫纳德

目录

描述

这个Functor(仿真器),莫纳德MonadPlus系列类,对monad进行一些有用的操作。

简介

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=>MonadPlus系列哪里来源

单数也支持选择和失败。

方法

mzero(零点)::毫安来源

的身份mplus(mplus).还应满足方程式

mzero>>=f=mzerov>>mzero=mzero

mplus(mplus)::ma->ma->ma来源

关联运算

功能

命名约定

此库中的函数使用以下命名约定:

  • 后缀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::莫纳德m=>(a->mb)->[a]->m[b]来源

地图M(f)等于序列.地图(f).

地图M_::莫纳德m=>(a->mb)->[a]->m()来源

地图M_(f)等于顺序_.地图(f).

用于M::莫纳德m=>【a】->(a->m b)->m【b】来源

对于M地图M争论不休

对于M_::莫纳德m=>【a】->(a->m b)->m()来源

对于M_地图M_争论不休

序列::莫纳德m=>【m a】->m【a】来源

按照从左到右的顺序评估每个动作,并收集结果。

顺序_::莫纳德m=>【m a】->m()来源

按照从左到右的顺序评估每个动作,忽略结果。

(=<<)::莫纳德m=>(a->mb)->ma->mb来源

等同于>>=,但参数互换。

(>=>)::莫纳德m=>(a->mb)->(b->mc)->a->mc来源

从左到右的单子Kleisli构图。

(<=<)::莫纳德m=>(b->m c)->(a->m b)->a->m c来源

单子体从右到左的克莱斯利构图。(>=>),参数翻转

永远::莫纳德m=>m a->m b来源

永远行为无限重复动作。

空隙::Functor(仿真器)f=>f a->f()来源

空隙价值丢弃或忽略求值结果,例如IO(输入输出)行动。

列表函数概述

参加::莫纳德m=>m(毫安)->毫安来源

这个参加函数是传统的monad连接操作符。它用于删除一级的一元结构,将其绑定参数投影到外部水平。

毫秒::MonadPlus系列m=>【m a】->m a来源

这概括了基于列表的凹面(concat)功能。

m过滤器::MonadPlus系列m=>(a->布尔)->毫安->毫安来源

直接MonadPlus系列等效于滤波器 滤波器=(mfilter::(a->Bool)->[a]->[a]适用于任何MonadPlus系列例如mfilter奇数(仅1)==仅1 mfilter奇数(仅2)==无

过滤器M::莫纳德m=>(a->m布尔)->[a]->m[a]来源

这概括了基于列表的滤波器功能。

映射并解压缩M::莫纳德m=>(a->m(b,c))->[a]->m([b],[c])来源

这个映射并解压缩M函数将其第一个参数映射到列表上,返回结果为一对列表。此功能主要用于复杂数据结构或状态转换单体。

带M的拉链::莫纳德m=>(a->b->mc)->[a]->[b]->m[c]来源

这个带M的拉链函数泛化拉链任意的单子。

带M的拉链_::莫纳德m=>(a->b->mc)->[a]->[b]->m()来源

带M的拉链_是的扩展zip带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

如果需要从右向左评估,则应反转输入列表。

foldM(折叠M)_::莫纳德m=>(a->b->ma)->a->[b]->m()来源

喜欢foldM(折叠M),但丢弃结果。

复制品M::莫纳德m=>国际->毫安->毫安来源

复制者Mn行动执行操作n个次,收集结果。

复制者M_::莫纳德m=>国际->毫安->米()来源

喜欢复制品M,但丢弃结果。

一元表达式的条件执行

什么时候::莫纳德m=>布尔->米()->米()来源

一元表达式的条件执行。例如,

调试时(putStr“Debugging\n”)

将输出字符串正在调试\n如果布尔值调试真的,否则什么也不做。

除非::莫纳德m=>布尔->米()->米()来源

的反面什么时候.

单体起重操作员

提升M::莫纳德m=>(a1->r)->m a1->m r来源

将函数升级为monad。

提升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个