|
|
- 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))
|