[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [MirageOS-devel] Using Result instead of Option in libraries
On 14/10/2016 15:44, Anil Madhavapeddy wrote: > On 14 Oct 2016, at 15:36, David Scott <scott.dj@xxxxxxxxx> wrote: >> >> Looks like we have a number of different conventions for the binds. Do we >> want to have the same set of operators with and without Lwt support (and >> open the Infix module locally as needed) or separate operators that be used >> alongside each other? >> >> I'm curious what people recommend here -- I'm certainly open to adopting a >> common convention even if it involves a bit of churn. >> >> Initially I kept minting my own infix operators (like `>>*=` `>>|=`) but it >> quickly got confusing for me and I probably didn't name them uniformly >> across projects. Recently I've stuck to `>>=` and have put different ones in >> different modules like this: >> >> ``` >> module LwtResult = struct >> let (>>=) m f = >> end >> ``` >> >> and now my code looks like (sometimes with extra newlines, but I don't have >> strong opinions about that) >> ``` >> let open Lwt.Infix in >> f () >>= fun () -> >> let open LwtResult in >> g () >>= fun () -> >> Lwt.return (Result.Ok ()) (* possibly should define `return` in the module >> too *) >> ``` >> Part of my rationale for using the same bind was a hope that one day modular >> implicits might automatically choose the right version and I could lose the >> `let open` but maybe this isn't possible? I'd find the code without the `let open __ in` even more confusing (and sometimes your `let open __ in` is already many lines away from its usage). > Good point. To go over to the "overload the operators" camp despite my > previous mail, I did remember that ppx_let supports arbitrary monadic and > applicative syntax: As said in my earlier mail, I find local `let open __ in` rather hard to follow. In the end, how many different binds do we need? I'd think two or three, the Lwt one (for effectful non-error-raising code), the rresult one (for pure code), and the combined one >>=? : (a, b) result Lwt.t -> (a -> (c, b) result Lwt.t) -> (c, b) result Lwt.t And there will likely be combinations of >>= and >>=? hannes _______________________________________________ MirageOS-devel mailing list MirageOS-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |