Last active
August 29, 2015 13:56
-
-
Save 314maro/9112923 to your computer and use it in GitHub Desktop.
モナドは単なるなんとやら
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-# LANGUAGE TypeOperators #-} | |
| -- a | |
| class Monoid' m where | |
| -- 非カリー化 | |
| append :: (m, m) -> m | |
| -- m と () -> m は同一視できる | |
| empty :: () -> m | |
| -- 型 ((), m) と m と (m, ()) は同一視できる | |
| -- 型 ((l, m), n) と (l, (m, n)) は同一視できる | |
| -- | |
| -- 以下を満たす必要がある | |
| -- ((m , m) , m) --append-> (m, m) --append-> m と | |
| -- (m , (m , m)) --append-> (m, m) --append-> m が同じ | |
| -- | |
| -- m --id-> m と | |
| -- ((), m) --empty-> (m, m) --append-> m と | |
| -- (m, ()) --empty-> (m, m) --append-> m が同じ | |
| type (f :. g) x = f (g x) | |
| type Id x = x | |
| -- join と unit (return) による定義 | |
| -- 上のモノイドの定義とそっくり | |
| class Functor m => Monad' m where | |
| -- m :. m -> m | |
| join :: (m :. m) a -> m a | |
| -- Id -> m | |
| unit :: Id a -> m a | |
| -- (Id :. m) a = (m :. Id) a = m a | |
| -- ((l :. m) :. n) a = (l :. (m :. n)) a -- Haskellではこれは正しくない型 | |
| -- | |
| -- 以下を満たす必要がある | |
| -- (m :. m) :. m -- join -> m :. m --join-> m と | |
| -- m :. (m :. m) --fmap join-> m :. m --join-> m が同じ | |
| -- | |
| -- m --id-> m と | |
| -- Id :. m -- unit -> m :. m --join-> m と | |
| -- m :. Id --fmap unit-> m :. m --join-> m が同じ | |
| -- | |
| -- および | |
| -- Id a --unit-> m a | |
| -- | | | |
| -- id f fmap f | |
| -- | | | |
| -- v v | |
| -- Id b --unit-> m b | |
| -- | |
| -- (m :. m) a --join-> m a | |
| -- | | | |
| -- fmap (fmap f) fmap f | |
| -- | | | |
| -- v v | |
| -- (m :. m) b --join-> m b |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment