1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374openBaseincludeMonad_intfmoduleMake2(M:S2):T2withtype('a,'z)t:=('a,'z)M.t=structmoduleS=MincludeSmoduleEX=structletfmapft=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_xsletmapMfls=seq(List.mapfls)letrecmapM_f=function|[]->return()|x::xs->bind(fx)&fun()->mapM_fxsletiterifls=seq_(List.mapifls)letrecfor_ito_f=ifi>to_thenreturn()elsebind(fi)&fun()->for_(i+1)to_fletjointt=bindtt&funat->atendincludeEXmoduleInfix=structlet(>>=)=M.bindlet(>>|)tf=fmapft(* Applicative style *)let(^<$>)ft=fmapftlet(/<*>)=funfa->f>>=funf->a>>=funa->return(fa)endincludeInfixendmoduleMake1(M:S1):T1withtype'at='aM.t=structtype'at='aM.ttype('a,'dummy)m='atmoduleM2=structtypenonrec('a,_)t='atinclude(M:S1withtype'at:='aM.t)(* hiding 'a t *)endinclude(Make2(M2):T2withtype('a,'dummy)t:=('a,'dummy)m)endmoduleMake=Make1