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 命名约定
此库中的函数使用以下命名约定:
- 后缀“M(M)“总是代表Kleisli类别中的函数:米被添加到函数结果中(模currying),而不是其他地方。例如,
过滤器::(a->Bool)->[a]->[a]
过滤器m::单子m=>(a->m Bool)->[a]->m[a]
- 后缀“_“将结果类型从(百万)到(米()).因此(在前奏曲):
序列:单子m=>[ma]->m[a]
序列_::单子m=>[ma]->m()
- 前缀“米“将现有函数概括为一元形式。因此,例如:
总和::数字a=>[a]->a
msum::MonadPlus m=>[m a]->m a
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月