那么,鉴于comonad的这种编码(见下文),上面的comonad法则是正确的吗?出于某种原因,我不认为他们是因为看了他们,我知道从那里走错了路只会产生糟糕的道路,所以我会感谢你的推动,暗示,帮助,回答你所拥有的。
/**
* note: I think these are right
* Comonad Laws
*
* (i) counit(cojoin(m)) == m
*
* (ii) >>(counit(m))(cojoin) == m
*
* (iii) cojoin(cojoin(m)) == >>(cojoin(m))(cojoin)
*
*/
trait Comonad[M[_]] {
// map
def >>[A,B](a: M[A])(f: A => B): B
// extract | coeta
def counit[A](a:M[A]): A
// cobind | =<< | extend
def coflatMap[A,B](ma:M[A])(f: M[A] => B): M[B]
// coflatten | comu
def cojoin[A](a: M[A]): M[M[A]]
}
发布于 2013-06-22 20:37:39
你就快到了。(i)
和(iii)
都是正确的,但(ii)
是错误的。您可以发现错误,因为(ii)
的类型不正确:对于>>(counit(m)
,参数counit(m)
的类型是A
,而不是M[A]
。
您的操作的正确法则是:
* (i) counit(cojoin(m)) == m
*
* (ii) >>(cojoin(m))(counit) == m
*
* (iii) cojoin(cojoin(m)) == >>(cojoin(m))(cojoin)
因此,对于(i)
和(ii)
,法则是将counit
或counit
的“映射”应用于cojoin
的结果等价于标识函数。
https://stackoverflow.com/questions/17247004
复制相似问题