packages feed

lol-calculus-1.20160822: Language/LOL/Calculus/lib/Monad.lol

Monad_Return (M:* -> *) (X:*)       = X -> M X
Monad_Join   (M:* -> *) (X:*)       = M (M X) -> M X
Monad_Bind   (M:* -> *) (X:*) (Y:*) = M X -> (X -> M Y) -> M Y

Monad_Class
 (M:* -> *) (Data:*)
 =  (return:∀(X:*) -> Monad_Return M X)
 -> (bind:∀(X:*) -> ∀(Y:*) -> Monad_Bind M X Y)
 -> Data
Monad_Polytype
 (M:* -> *) : *p
 = (Data:*) -> Monad_Class M Data -> Data
Monad
 (M:* -> *) : *m
 = Monotype (Monad_Polytype M)

monad
 (M:* -> *)
 (return:∀(X:*) -> Monad_Return M X)
 (bind:∀(X:*) -> ∀(Y:*) -> Monad_Bind M X Y)
 : Monad M
 = monotype (Monad_Polytype M)
    (λ(Data:*) (monad_class:Monad_Class M Data) ->
      monad_class return bind)
unMonad
 (M:* -> *) (Data:*)
 (monad_class:Monad_Class M Data)
 (monad:Monad M)
 : Data
 = polytype (Monad_Polytype M) monad Data monad_class

Monad_return
 (M:* -> *) (monad:Monad M) (X:*)
 : Monad_Return M X
 = unMonad M (Monad_Return M X)
    (λ(return:∀(X:*) -> Monad_Return M X)
      (bind:∀(X:*) -> ∀(Y:*) -> Monad_Bind M X Y)
     -> return X
    ) monad
Monad_bind
 (M:* -> *) (monad:Monad M) (X:*) (Y:*)
 : Monad_Bind M X Y
 = unMonad M (Monad_Bind M X Y)
    (λ(return:∀(X:*) -> Monad_Return M X)
      (bind:∀(X:*) -> ∀(Y:*) -> Monad_Bind M X Y)
     -> bind X Y
    ) monad
Monad_join
 (M:* -> *) (monad:Monad M) (X:*)
 : Monad_Join M X
 = λ(m:M (M X)) ->
   Monad_bind M monad (M X) X m (λ(x:M X) -> x)