Haskell 98报告
顶部|后面|下一个|目录|功能索引

20  Monad公用设施


模块Monad(
MonadPlus(mzero,mplus),
加入,守卫,何时,除非,ap,
毫秒,
filterM、mapAndUnzipM、zipWithM、zip WithM_、foldM、
提升M、提升M2、提升M3、提升M4、提升M5、,

    -- ...以及前奏曲的出口
Monad((>>=),(>>),返回,失败),
函数(fmap),
mapM,mapM_,sequence,sequence_,(=<<)
)其中

类Monad m=>MonadPlus m,其中
mzero::毫安
mplus::ma->ma->ma

连接::Monad m=>m(ma)->m a
防护::MonadPlus m=>布尔->m()
时间::Monad m=>Bool->m()->m()
除非:Monad m=>Bool->m()->m()
ap:单体m=>m(a->b)->m a->m b

mapAndUnzipM::单数m=>(a->m(b,c))->[a]->m([b],[c])
zipWithM::单色m=>(a->b->mc)->[a]->[b]->m[c]
zipWithM_::单数m=>(a->b->mc)->[a]->[b]->m()
foldM::单数m=>(a->b->ma)->a->[b]->ma
过滤器m::单子m=>(a->m Bool)->[a]->m[a]

msum::MonadPlus m=>[ma]->ma

升力m::单车m=>(a->b)->(ma->mb)
升力M2::莫纳德m=>(a->b->c)->(m a->m b->m c)
提升M3::单车m=>(a->b->c->d)->
(m a->m b->m c->m d)
提升M4::单车m=>(a->b->c->d->e)->
(m a->m b->m c->m d->m e)
提升M5::单车m=>(a->b->c->d->e->f)->
(m a->m b->m c->m d->m e->m f)

这个莫纳德库定义MonadPlus系列类,以及在monad上提供了一些有用的操作。

20.1  命名约定

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

20.2  类别MonadPlus系列

这个MonadPlus系列类的定义如下:

类Monad m=>MonadPlus m,其中
mzero::毫安
mplus::ma->ma->ma

类方法mzero(零点)mplus(mplus)是零和正单子。

列表和也许 吧类型是的实例MonadPlus系列,因此:

实例MonadPlus也许在哪里
mzero=无
无`mplus`ys=ys
xs`mplus`ys=xs

实例MonadPlus[],其中
mzero=[]
mplus=(++)

20.3  功能

这个参加函数是传统的monad连接操作符。它是用于移除一级一元结构,突出其边界外部层面的论证。

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

这个带M的拉链函数概述拉链任意的单子。例如,以下函数显示一个文件,前缀为每行及其行号,

listFile::String->IO()
列表文件nm=
do cts<-readFile nm
zipWithM_(\i line->执行putStr(show i);putStr“:”;putStrLn行)
               [1..]
(第cts行)

这个折叠M函数类似于折叠,除了它的结果封装在单子体中。请注意折叠M作品来自从左到右覆盖列表参数。这可能是一个问题(>>)“折叠函数”是不可交换的。

foldM f a1[x1,x2,…,xm]
==  

a2<-f a1 x1
a3<-f a2x2
      ...
f上午xm

如果从右向左需要评估,输入列表应该颠倒。

这个什么时候除非函数提供条件执行一元表达式。例如,

调试时(putStr“Debugging\n”)

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

单子提升操作符将函数提升为单子。这个从左到右扫描函数参数。例如,

提升M2(+)[0,1][0,2]=[0,2,1,3]
liftM2(+)(仅1)无=无

在许多情况下提升M操作可以替换为使用属于应用程序,促进功能应用。

return f`ap`x1`ap`。。。`ap`xn

等于

提升Mn f x1 x2。。。x个

20.4  图书馆莫纳德


Monad模块(
MonadPlus(mzero,mplus),
加入,守卫,何时,除非,ap,
msum中,
filterM、mapAndUnzipM、zipWithM、zip WithM_、foldM、
提升M、提升M2、提升M3、提升M4、提升M5、,

    -- ...以及前奏曲的出口
Monad((>>=),(>>),返回,失败),
函数(fmap),
mapM,mapM_,sequence,sequence_,(=<<)
)其中


--MonadPlus类定义

class(Monad m)=>MonadPlus m,其中
mzero::百万
mplus::ma->ma->ma


--MonadPlus实例

实例MonadPlus可能在哪里
mzero=无

无`mplus`ys=ys
xs`mplus`ys=xs

实例MonadPlus[],其中
mzero=[]
mplus=(++)


--功能


msum::MonadPlus m=>[m a]->m a
msum xs=foldr mplus mzero xs

连接::(单数m)=>m(ma)->m a
连接x=x>>=id

当::(单数m)=>布尔->m()->m(
当p s=如果p,则s返回()

除非:(单数m)=>Bool->m()->m()
除非p s=当(非p)s

ap::(单数m)=>m(a->b)->m a->m b
ap=提升M2($)

防护::MonadPlus m=>Bool->m()
保护p=如果p,则返回()否则mzero

mapAndUnzipM::(单子图m)=>(a->m(b,c))->[a]->m([b],[c])
mapAndUnzipM f xs=sequence(map f xs)>>=return。解压缩

zipWithM::(单数m)=>(a->b->mc)->[a]->[b]->m[c]
zipWithM f xs ys=序列(zipWith f xs ys)

zipWithM_::(单数m)=>(a->b->mc)->[a]->[b]->m()
zipWithM_f xs-ys=sequence_(zipWith f xs-ys)

foldM::(单数m)=>(a->b->ma)->a->[b]->ma
foldM f a[]=返回a
foldM f a(x:xs)=f a x>>=\y->foldM fy xs

过滤器m::单子m=>(a->m Bool)->[a]->m[a]
过滤器M p[]=返回[]
过滤器M p(x:xs)=do{b<-p x;
ys<-filterM p xs; 
return(如果b,则为(x:ys)else ys)
   }

升力m::(Monad m)=>(a->b)->(m a->m b)
liftM f=\a->do{a'<-a;return(fa')}

电梯M2::(单车m)=>(a->b->c)->(m-a->mb->mc)
liftM2 f=\a b->执行{a'<-a;b'<-b;返回(f a'b')}

提升M3::(单车m)=>(a->b->c->d)->
(m a->m b->m c->m d)
liftM3 f=\a b c->执行{a’<-a;b’<-b;c’<-c;
返回(fa'b'c')}

提升M4::(单车m)=>(a->b->c->d->e)->
(m a->m b->m c->m d->m e)
提升M4 f=\a b c d->执行{a'<-a;b'<-b;c'<-c;d'<-d;
return(f a‘b’c‘d’)}

提升M5::(单车m)=>(a->b->c->d->e->f)->
(m a->m b->m c->m d->m e->m f)
liftM5 f=\a b c d e->执行{a'<-a;b'<-b;c'<-c;d'<-d;
e’<-e;return(fa'b'c'd'e')}



Haskell 98报告
顶部|后面|下一个|目录|功能索引
2002年12月