aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/Errormonad.v
blob: 09c5c1c5d7112872d3d441abcaba50011d865ccd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
From compcert Require Export Errors.
From vericert Require Import Monad.
From Coq Require Import Lists.List.

Module ErrorMonad <: Monad.

  Definition mon := res.

  Definition ret {A: Type} (x: A) := OK x.

  Definition default {T : Type} (x : T) (u : res T) : T :=
    match u with
    | OK y => y
    | _ => x
    end.

  Definition map {S : Type} {T : Type} (f : S -> T) (u : mon S) : mon T :=
    match u with
    | OK y => OK (f y)
    | Error m => Error m
    end.

  Definition liftA2 {T : Type} (f : T -> T -> T) (a : mon T) (b : mon T) : mon T :=
    match a with
    | OK x => map (f x) b
    | Error m => Error m
    end.

  Definition bind {A B : Type} (f : mon A) (g : A -> mon B) : mon B :=
    match f with
    | OK a => g a
    | Error m => Error m
    end.

  Definition bind2 {A B C : Type} (f : mon (A * B)) (g : A -> B -> mon C) : mon C :=
    match f with
    | OK (a, b) => g a b
    | Error m => Error m
    end.

  Definition join {A : Type} (a : mon (mon A)) : mon A :=
    match a with
    | Error m => Error m
    | OK a' => a'
    end.

End ErrorMonad.

Module ErrorMonadExtra := MonadExtra(ErrorMonad).