123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596openBaseincludeMonad_intfmoduleMake2(M:S2)=structincludeMletfmapft=bindt&funx->return(fx)letliftM=fmapletfmap2ftu=bindt&funt->bindu&funu->return&ftuletliftM2=fmap2letvoida=binda&fun_->return()letrecseq=function|[]->return[]|x::xs->bindx&funx->bind(seqxs)&funxs->return(x::xs)letrecseq_=function|[]->return()|x::xs->bindx&fun()->seq_xsletrecmapMf=function|[]->return[]|x::xs->bind(fx)&funy->bind(mapMfxs)&funys->return(y::ys)letrecmapM_f=function|[]->return()|x::xs->bind(fx)&fun()->mapM_fxsletiterifls=letrecloopfi=function|[]->return()|x::xs->bind(fix)&fun()->bind(loopf(i+1)xs)&fun()->return()inloopf0lsletrecfor_ito_f=ifi>to_thenreturn()elsebind(fi)&fun()->for_(i+1)to_fletjointt=bindtt&funat->atletprodatbt=bindat(funa->fmap(funb->(a,b))bt)moduleInfix=structlet(>>=)=M.bindlet(>>|)tf=fmapftlet(>|=)=(>>|)(* Applicative style *)let(^<$>)ft=fmapftlet(/<*>)=funfa->f>>=funf->a>>=funa->return(fa)endmoduleSyntax=structlet(let*)=Infix.(>>=)let(let+)=Infix.(>>|)let(and*)=prodlet(and+)=prodendendmoduleMake1(M:S1)=structtype'at='aM.ttype('a,'dummy)m='atmoduleM2=structtypenonrec('a,_)t='atinclude(M:S1withtype'at:='aM.t)(* hiding 'a t *)endinclude(Make2(M2):sigincludeT2withtype('a,'dummy)t:=('a,'dummy)mmoduleInfix:Infix2withtype('a,'dummy)t:=('a,'dummy)mmoduleSyntax:Syntax2withtype('a,'dummy)t:=('a,'dummy)mend)endmoduleMake=Make1