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 是个类型类。

比较 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。

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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值