123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657(** Result monad *)type('a,'error)t=('a,'error)resultletbindtf=matchtwith|Okv->fv|Errorerr->Errorerrlet(>>=)=bindletfmapft=matchtwith|Okv->Ok(fv)|Errorerr->Errorerrlet(>>|)tf=fmapftletmapdects=letrecmapst=function|[]->Ok(List.revst)|t::ts->matchdectwith|Okh->map(h::st)ts|Errorerr->Errorerrinmap[]tsletmapidects=letrecmapstn=function|[]->Ok(List.revst)|t::ts->matchdecntwith|Okh->map(h::st)(n+1)ts|Errorerr->Errorerrinmap[]0tsletfaile=Erroreletcatchf=letmoduleError=structexceptionErrorendinleterror=refNoneinletfaile=error:=Somee;raiseError.ErrorintryOk(f~fail)with|Error.Error->match!errorwith|Somee->Errore|None->assertfalseletcatch_exnf=catch(fun~fail->tryf()withe->faile)letresultokferrf=function|Okv->okfv|Errore->errfemoduleOpen=structlet(>>=)=(>>=)let(>>|)=(>>|)end