Skip to content

Instantly share code, notes, and snippets.

@314maro
Last active August 29, 2015 13:56
Show Gist options
  • Select an option

  • Save 314maro/9112923 to your computer and use it in GitHub Desktop.

Select an option

Save 314maro/9112923 to your computer and use it in GitHub Desktop.
モナドは単なるなんとやら
{-# 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