open import "prelude.ml"
|
|
|
|
type identity 'a = Id of 'a
|
|
|
|
instance functor identity begin
|
|
let f <$> Id x = Id (f x)
|
|
end
|
|
|
|
instance applicative identity begin
|
|
let pure = Id
|
|
let Id f <*> Id x = Id (f x)
|
|
end
|
|
|
|
instance monad identity begin
|
|
let Id x >>= f = f x
|
|
end
|
|
|
|
type state 's 'a = State of 's -> 'a * 's
|
|
|
|
let run_state (State k) = k
|
|
|
|
instance functor (state 's) begin
|
|
let f <$> State x = State (first f # x)
|
|
end
|
|
|
|
instance applicative (state 's) begin
|
|
let pure x = State (x,)
|
|
let State f <*> State x = State @@ fun s ->
|
|
let (f, s) = f s
|
|
let (x, s) = x s
|
|
(f x, s)
|
|
end
|
|
|
|
instance monad (state 's) begin
|
|
let State x >>= f = State @@ fun s ->
|
|
let (x, s) = x s
|
|
run_state (f x) s
|
|
end
|
|
|
|
let get = State (fun s -> (s, s))
|
|
let put x = State (fun _ -> ((), x))
|
|
let modify f = State (fun s -> ((), f s))
|