Home

Awesome

ppx_monad

Minimalistic monad syntax for OCaml. This extension features a syntax for monadic computations inspired by Haskell. While processing the source code, each occurence of name <- monad; body is converted into monad >>= fun name -> body. No additional validation or substitutions are performed. Pattern matching is not supported on bind site, but can be used on already bound variables.

Example:

module Option = struct
  type 'a t = 'a option

  let return x = Some x

  let (>>=) self f =
    match self with
    | Some x -> f x
    | None   -> None
end

let put_line str =
  try
    Some (output_string (str ^ "\n"))
  with e ->
    None

let get_line () =
  try
    Some (input_line stdin)
  with End_of_file ->
    None

open Option

let concat_lines () =
  begin%monad
    put_line "input two lines";
    a <- get_line ();
    b <- get_line ();
    return (a ^ b)
  end

let () =
  match concat_lines () with
  | Some line -> print_endline line
  | None      -> print_endline "error"

Warning: this extension conflicts with the syntax for mutable update of object instances. Since objects are not considered an idiomatic OCaml and are not used frequently (and even less with mutable fields), this extension can be safely used in regular projects.