Skip to content

Instantly share code, notes, and snippets.

@zbroyar
Created November 9, 2010 16:00
Show Gist options
  • Save zbroyar/669279 to your computer and use it in GitHub Desktop.
Save zbroyar/669279 to your computer and use it in GitHub Desktop.
Монада невдалого обчислення.
(* Повертає монаду *)
let return x = Some x ;;
(* Перевіряє монаду на наявність значення та повертає результат
застосування функції до цього значення, інакше повертає *)
let (>>=) m f =
match m with
| None -> None
| Some x -> f x ;;
(* M (M a) -> M a *)
let join m = match m with None -> None | Some x -> x ;;
(* Застосовує функцію до значення монади *)
let fmap f m = m >>= fun x -> return (f x) ;;
(* Застосовує функцію двох змінних до значення двох монад *)
let lift2m f m n = m >>= fun x -> n >>= fun y -> return (f x y) ;;
(* Застосовує функцію двох змінних до значення двох монад. Якщо
результат виконання функції - None, то повертає значення першої монади. *)
let lift2mp1 f m n =
match lift2m f m n with None -> m | Some x -> return x ;;
(* Застосовує функцію двох змінних до значення двох монад. Якщо
результат виконання функції - None, то повертає значення другої монади. *)
let lift2mp2 f m n =
match lift2m f m n with None -> n | Some x -> return x ;;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment