trait Comonad[M[_]] {
// map
def >>[A,B](a: M[A])(f: A => B): M[B]
// extract | coeta
def counit[A](a:M[A]): A
// coflatten | comu
def cojoin[A](a: M[A]): M[M[A]]
}
object Comonad {
implicit def listComonad[A]: Comonad[List]
=
new Comonad[List] {
def counit[A](lsa: List[A])
=
lsa match { case List(a) => a }
def cojoin[A](lsa:List[A]): List[List[A]]
=
List(lsa)
def >>[A,B](lsa: List[A])(f: A => B): List[B]
=
lsa map f
}
}所以是的,我在看这个,我没有那种正确的感觉.
有人介意纠正这个问题,或者提供一两个其他简单的共餐吗?
发布于 2013-06-23 11:52:45
我相信,困扰你的是counit的非全局性定义,对吧?(对于cojoin来说,一个可能的变体是lsa.tails)实际上,List没有一个有效的comonad实例,特别是因为它。不过,它确实有一个有效的半模 实例。
具有有效comonad实例的东西是,例如:身份、NonEmptyList、拉链、元组。下面是一个包含更多comonad示例的reddit问题。
https://codereview.stackexchange.com/questions/27685
复制相似问题