Haskell語言學習筆記(51)Comonad

Comonad

class Functor w => Comonad w where
  extract :: w a -> a

  duplicate :: w a -> w (w a)
  duplicate = extend id

  extend :: (w a -> b) -> w a -> w b
  extend f = fmap f . duplicate

Comonad 是個類型類。html

比較 Monad 和 Comonad

class Functor m => Monad m where
  return :: a -> m a
  bind :: (a -> m b) -> (m a -> m b)
  join :: m (m a) -> m a

  join = bind id
  bind f = fmap f . join
  
  (>>=) :: m a -> (a -> m b) -> m b
  (>>=) = flip bind


class Functor w => Comonad w where
  extract :: w a -> a
  extend :: (w a -> b) -> w a -> w b
  duplicate :: w a -> w (w a)

  duplicate = extend id
  extend f = fmap f . duplicate
  
  (=>>) :: w b -> (w b -> a) -> a
  (=>>) = flip extend

((,) e) 是個 Comonad

也稱做 CoReader(Env) Comonad。app

instance Comonad ((,)e) where
  duplicate p = (fst p, p)
  extract = snd
Prelude Control.Comonad> duplicate (3,4)
(3,(3,4))
Prelude Control.Comonad> extract (3,4)
4
Prelude Control.Comonad> extend fst (3,4)
(3,3)
Prelude Control.Comonad> extend snd (3,4)
(3,4)

((->)m) 是個 Comonad

也稱做 CoWriter(Traced) Comonad。ide

instance Monoid m => Comonad ((->)m) where
  duplicate f m = f . mappend m
  extract f = f mempty

參考連接

Haskell for all: Comonads are objects
Comonads in Haskell.net

相關文章
相關標籤/搜索