According to the Haskell wikibook,å为Monad
的{​​{1}}是m
,还有两项é¢å¤–çš„æ“作:
Functor
这很好,但我有些ä¸åŒã€‚对血腥细节进行ç€è‰²ï¼Œæˆ‘的类型具有良好的unit :: a -> m a
join :: m (m a) -> m a
å’Œunit
函数,但其​​join
表现ä¸ä½³ï¼ˆfmap
ä¸ä¸€å®šæ˜¯{{1} }ï¼‰ã€‚å› æ¤ï¼Œå®ƒä¸èƒ½æˆä¸ºfmap g . fmap f
的实例。尽管如æ¤ï¼Œæˆ‘还是希望尽å¯èƒ½å¤šåœ°æ供通用功能。
所以我的问题是,什么类别的ç†è®ºç»“构与monadç›¸ä¼¼ï¼Œå› ä¸ºä»–ä»¬æœ‰fmap (g.f)
å’ŒMonad
?
我æ„识到在æŸç§ç¨‹åº¦ä¸Šï¼Œä¸Šè¿°é—®é¢˜æ˜¯ä¸æ˜Žç¡®çš„。对于monad,unit
å’Œjoin
定义仅对unit
定义有æ„义。如果没有join
ï¼Œåˆ™æ— æ³•å®šä¹‰ä»»ä½•monadæ³•å¾‹ï¼Œå› æ¤fmap
/ fmap
的任何定义都åŒæ ·â€œæœ‰æ•ˆâ€ã€‚所以我æ£åœ¨å¯»æ‰¾é™¤unit
以外的函数,在这些join
å’Œfmap
函数ä¸å®šä¹‰ä¸€äº›â€œéžmonadâ€å®šå¾‹å¯èƒ½æ˜¯æœ‰æ„义的。
ç”案 0 :(得分:3)
这里åªæœ‰unit
å’Œjoin
的法律。给定x :: m a
,
join (unit x) = x
为了è¯æ˜Žè¿™ä¸ä»…ä»…æ˜¯ä»Žæ— åˆ°æœ‰ï¼Œè®©æˆ‘ä»¬ä»ŽçŽ°æœ‰çš„monad法开始:
return x >>= f = f x
鉴于m >>= f = join (fmap f m)
join (fmap f (return x)) = f x
选择f = id
join (fmap id (return x)) = id x
使用fmap id = id
join (id (return x)) = id x
使用明显的id a = a
join (return x) = x