Monad.agda 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. module Lib.Monad where
  2. open import Lib.Nat
  3. open import Lib.List
  4. open import Lib.IO hiding (IO; mapM)
  5. open import Lib.Maybe
  6. open import Lib.Prelude
  7. infixr 40 _>>=_ _>>_
  8. infixl 90 _<*>_ _<$>_
  9. -- Wrapper type, used to ensure that ElM is constructor-headed.
  10. record IO (A : Set) : Set where
  11. constructor io
  12. field unIO : Lib.IO.IO A
  13. open IO
  14. -- State monad transformer
  15. data StateT (S : Set)(M : Set -> Set)(A : Set) : Set where
  16. stateT : (S -> M (A × S)) -> StateT S M A
  17. runStateT : forall {S M A} -> StateT S M A -> S -> M (A × S)
  18. runStateT (stateT f) = f
  19. -- Reader monad transformer
  20. data ReaderT (E : Set)(M : Set -> Set)(A : Set) : Set where
  21. readerT : (E -> M A) -> ReaderT E M A
  22. runReaderT : forall {E M A} -> ReaderT E M A -> E -> M A
  23. runReaderT (readerT f) = f
  24. -- The monad class
  25. data Monad : Set1 where
  26. maybe : Monad
  27. list : Monad
  28. io : Monad
  29. state : Set -> Monad -> Monad
  30. reader : Set -> Monad -> Monad
  31. ElM : Monad -> Set -> Set
  32. ElM maybe = Maybe
  33. ElM list = List
  34. ElM io = IO
  35. ElM (state S m) = StateT S (ElM m)
  36. ElM (reader E m) = ReaderT E (ElM m)
  37. return : {m : Monad}{A : Set} -> A -> ElM m A
  38. return {maybe} x = just x
  39. return {list} x = x :: []
  40. return {io} x = io (returnIO x)
  41. return {state _ m} x = stateT \s -> return (x , s)
  42. return {reader _ m} x = readerT \_ -> return x
  43. _>>=_ : {m : Monad}{A B : Set} -> ElM m A -> (A -> ElM m B) -> ElM m B
  44. _>>=_ {maybe} nothing k = nothing
  45. _>>=_ {maybe} (just x) k = k x
  46. _>>=_ {list} xs k = foldr (\x ys -> k x ++ ys) [] xs
  47. _>>=_ {io} (io m) k = io (bindIO m (unIO ∘ k))
  48. _>>=_ {state S m} (stateT f) k = stateT \s -> f s >>= rest
  49. where
  50. rest : _ × _ -> ElM m _
  51. rest (x , s) = runStateT (k x) s
  52. _>>=_ {reader E m} (readerT f) k = readerT \e -> f e >>= \x -> runReaderT (k x) e
  53. -- State monad class
  54. data StateMonad (S : Set) : Set1 where
  55. state : Monad -> StateMonad S
  56. reader : Set -> StateMonad S -> StateMonad S
  57. ElStM : {S : Set} -> StateMonad S -> Monad
  58. ElStM {S} (state m) = state S m
  59. ElStM (reader E m) = reader E (ElStM m)
  60. ElSt : {S : Set} -> StateMonad S -> Set -> Set
  61. ElSt m = ElM (ElStM m)
  62. get : {S : Set}{m : StateMonad S} -> ElSt m S
  63. get {m = state m} = stateT \s -> return (s , s)
  64. get {m = reader E m} = readerT \_ -> get
  65. put : {S : Set}{m : StateMonad S} -> S -> ElSt m Unit
  66. put {m = state m} s = stateT \_ -> return (unit , s)
  67. put {m = reader E m} s = readerT \_ -> put s
  68. -- Reader monad class
  69. data ReaderMonad (E : Set) : Set1 where
  70. reader : Monad -> ReaderMonad E
  71. state : Set -> ReaderMonad E -> ReaderMonad E
  72. ElRdM : {E : Set} -> ReaderMonad E -> Monad
  73. ElRdM {E} (reader m) = reader E m
  74. ElRdM (state S m) = state S (ElRdM m)
  75. ElRd : {E : Set} -> ReaderMonad E -> Set -> Set
  76. ElRd m = ElM (ElRdM m)
  77. ask : {E : Set}{m : ReaderMonad E} -> ElRd m E
  78. ask {m = reader m } = readerT \e -> return e
  79. ask {m = state S m} = stateT \s -> ask >>= \e -> return (e , s)
  80. local : {E A : Set}{m : ReaderMonad E} -> (E -> E) -> ElRd m A -> ElRd m A
  81. local {m = reader _ } f (readerT m) = readerT \e -> m (f e)
  82. local {m = state S _} f (stateT m) = stateT \s -> local f (m s)
  83. -- Derived functions
  84. -- Monad operations
  85. _>>_ : {m : Monad}{A B : Set} -> ElM m A -> ElM m B -> ElM m B
  86. m₁ >> m₂ = m₁ >>= \_ -> m₂
  87. _<*>_ : {m : Monad}{A B : Set} -> ElM m (A -> B) -> ElM m A -> ElM m B
  88. mf <*> mx = mf >>= \f -> mx >>= \x -> return (f x)
  89. _<$>_ : {m : Monad}{A B : Set} -> (A -> B) -> ElM m A -> ElM m B
  90. f <$> m = return f <*> m
  91. mapM : {m : Monad}{A B : Set} -> (A -> ElM m B) -> List A -> ElM m (List B)
  92. mapM f [] = return []
  93. mapM f (x :: xs) = _::_ <$> f x <*> mapM f xs
  94. -- State monad operations
  95. modify : {S : Set}{m : StateMonad S} -> (S -> S) -> ElSt m Unit
  96. modify f = get >>= \s -> put (f s)
  97. -- Test
  98. -- foo : Nat -> Maybe (Nat × Nat)
  99. -- foo s = runReaderT (runStateT m s) s
  100. -- where
  101. -- m₁ : StateT Nat (ReaderT Nat Maybe) Nat
  102. -- m₁ = local suc (ask >>= \s -> put (s + 3) >> get)
  103. -- The problem: nested injective function don't seem to work
  104. -- as well as one could hope. In this case:
  105. -- ElM (ElRd ?0) == ReaderT Nat Maybe
  106. -- inverts to
  107. -- ElRd ?0 == reader Nat ?1
  108. -- ElM ?1 == Maybe
  109. -- it seems that the injectivity of ElRd isn't taken into account(?)
  110. -- m : ReaderT Nat Maybe Nat
  111. -- m = ask