ãã®è¨äºã¯ãHaskellãåå¼·ãã¦ããç¨åº¦åãã£ããã©ãMonadã§æ«æãã人ã®ããã®è¨äºã§ãã10åéã§ãMonadã«å¯¾ããç´å¾æãå¾ããã¨ãç®çã¨ãã¦ãã¾ããä»ã®è¨èªã§ãããã¢ãããã«ãéç¨ããå 容ã§ãããHaskell ã®ææ³ãç¨èªãç¨ãã¾ãã®ã§ãä»ã®è¨èªã®å©ç¨è ã«åãããã¯ä¸æã§ãã
Haskellãåå¼·ããã®ã§ãããã
- 代æ°ãã¼ã¿å
- åã¯ã©ã¹
ã¯åãã£ã¦ãããã¨ã«ãã¾ããMonad ã¯ãåãªãåã¯ã©ã¹ã®ä¸ã¤ã§ããã以ä¸ã§ããã以ä¸ã§ãããã¾ããããããã®äºã¤ãåãã£ã¦ãªãã¨è©±ã«ãªãã¾ããã
ã¾ããè¨èªå DSL(以ä¸ãDSLã¨ç¥è¨)ã¨ããèãæ¹ãç¥ã£ã¦ãããã¨ãä»®å®ãã¾ããMonad ã¨ã¯ãDSLã®ãã¬ã¼ã ã¯ã¼ã¯ã¨ããç´æãä¸ããã®ãããã®è¨äºã®ä¸»ç¼ã§ããããã
ããã«ã構造化定理ãããåèªãèãã¦ãããããªã人ãæ³å®ãã¦ãã¾ããé次ãå復ãåå²ãããã°ãè¨ç®ãããè¨ç®ã¯ãã¹ã¦è¨è¿°ã§ããã¨ããå®çã§ããMonad ã®èª¬æã«ãããã¡ãªåè«ãæã¡åºãããããããã£ã½ã©ããã§ãããï¼
Monad ã¨ã¯ä½ãï¼
ç¹°ãè¿ãã«ãªãã¾ãããMonad ã¨ã¯åã«åã¯ã©ã¹ã®ä¸ã¤ã§ããããã¦ãMonad ã¨ã¯ãDSLã®ããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ããã¤ã¾ãããã代æ°åã Moand åã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã«ããã°ãä½ããã® DSL ã«ãªãã¨ãããã¨ã§ãï¼
DSLã®ä¾ãæãã¦ã¿ã¾ãããã
- Maybe ã¯ã失æããå¯è½æ§ãããè¨ç®ã®ããã®DSLã§ã
- State ã¯ãããããã°ãã¼ãã«å¤æ°ã®ãããªç¶æ ããããã®ããã«è¦ããããããã® DSLã§ã
- IO ã¯ãå½ä»¤ããã°ã©ãã³ã°ã®ããã®DSLã§ã
代æ°ãã¼ã¿å
é©ãã¹ããã¨ã«ãHaskell 㧠m a ã¨ããå½¢ã®ä»£æ°ãã¼ã¿åãå®ç¾©ããã¨ãããã¯DSLã«ãªãå¯è½æ§ãç§ãã¦ãã¾ããä¸çªç°¡åãªä»¥ä¸ã®ãããªä»£æ°ãã¼ã¿åã§ããã(ä½ãããªãã¨ããã)DSLã«ãªãã¾ãã
data Identity a = Identity a
ä¸è¬çã«é¢æ°ã¯ a -> b ã¨ããåã®å½¢ãæã£ã¦ãã¾ããä¸æ¹ãa -> m b ã¨ããå½¢ã®é¢æ°ã¯ãm ã®ã¨ããã«ãè¨ç®ä»¥å¤ã®ä»äºãã¨ããæå³ãå«ã¾ããããã«ãªãã¾ãã(ãè¨ç®ä»¥å¤ã®ä»äºãã®ãã¨ãå½ä»¤åã§ã¯ãå¯ä½ç¨ããé¢æ°åã§ã¯ã¨ãã§ã¯ãã¨å¼ãã ããã¾ãã) Monad ã®ã¤ã³ã¹ã¿ã³ã¹ã¨ã¯ããã®è¨ç®ä»¥å¤ã®ä»äºããã DSL ãªã®ã§ãã
Functor åã¯ã©ã¹
代æ°ãã¼ã¿åãå®ç¾©ããã°ãDSLã«ãªããã¨ãåããã¾ãããã次ã¯ããã®DSLã®ä¸ã§ã(a -> b ã®å½¢ããã)ãæ¢åã®é¢æ°ãã使ããããªãã§ãããããã®æ¢åã®é¢æ°ã¨ DSL ãçµã³ã¤ããã®ã Functor åã¯ã©ã¹ã§ãã
class Functor m where (<$>) :: (a -> b) -> m a -> m b -- å®é㯠fmap
ãããªé¢¨ã«ä½¿ãã¾ãã
> (+1) <$> Identity 1 Identity 2
Applicative åã¯ã©ã¹
DSLã¨ããããã«ã¯ãæ§é åå®çã§ããé次ãå復ãåå²ãã§ããã¹ãã§ãããããã®å ã®äºã¤ãã¤ã¾ãé次ã¨å復ãå®ç¾ããã®ããApplicative åã¯ã©ã¹ã§ãã
class Functor m => Applicative m where return :: a -> m a -- å®é㯠pure (<*>) :: m (a -> b) -> m a -> m b
é次ã¨å復ããªãã¨å®ç¾ã§ããªã sqnc ã¨ããé¢æ°ããããã®é¢æ°ã使ã£ã¦å®ç¾©ãã¦ã¿ã¾ãããã
sqnc :: Applicative m => [m a] -> m [a] sqnc [] = return [] -- å®é㯠pure ã«ãã¦ã sqnc (x:xs) = (:) <$> x <*> sqnc xs
以ä¸ã®ããã«é次å®è¡ã§ãã¾ãã
sqnc [putStrLn "Hello", putStrLn "World"] Hello World [(),()]
ã¾ããsqnc ã®ä¸ã§ã¯å帰ã使ãã¦ãã¾ããããå復ã§ãã¦ããã®ãæããã§ãã
Monad åã¯ã©ã¹
æ®ãã¯åå²ã§ãããããå®ç¾ããã®ããMonad ã§ãã
class Applicative m => Monad m where (>>=) :: m a -> (a -> m b) -> m b
åå²ã®ä¾ãä¸ã¤ç¤ºãã¾ãããããã¡ã¤ã«ããã£ããåé¤ããã¨ããã³ã¼ãã¯ã以ä¸ã®ããã«ãªãã¾ãã
doesFileExist :: FilePath -> IO Bool removeFile :: FilePath -> IO () removeFileIfExist :: FilePath -> IO () removeFileIfExist file = doesFileExist file >>= \exist -> if exist then removeFile file else return ()
ã¾ã¨ã
m a ã¨ããå½¢ã®åã FunctorãApplicativeãMonad ã¨åºä¸ããã¦ããã°ãå©ç¨ã§ããæ©è½ãå¤ããªããæå¾ã«ãã£ã±ãª DSL ã¨ãªã£ããã¨ãåãã£ãã§ããããMonad ãå©ç¨ããã ããªããããä»¥ä¸ Monad ã®ãã¨ã深追ãããå¿ è¦ã¯ããã¾ããããã¨ã¯ãããããã³ã¼ããæ¸ãã¦æ £ããã®ã¿ã§ãã
ããå°ã詳ããåå¼·ããã人ã®ããã«ãåèæç®/è¨äºãæãã¦ããã¾ãã