4

因此,鉴于这种共单子编码(见下文),它上面的共单子定律是否正确?出于某种原因,我不认为他们是看着他们的,而且我知道从那里走错只会产生糟糕的道路,所以我会很感激轻推、提示、帮助、回答你有什么。

      /**
       * 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]]
        }
4

1 回答 1

4

你快到了。两者都是正确的,但(i)都是错误的。您可以发现错误,因为类型不好:因为参数具有类型而不是.(iii)(ii)(ii)>>(counit(m)counit(m)AM[A]

您的操作的正确法则是:

   * (i)   counit(cojoin(m))      == m
   * 
   * (ii)  >>(cojoin(m))(counit)  == m
   * 
   * (iii) cojoin(cojoin(m))      == >>(cojoin(m))(cojoin)

因此,对于(i)(ii),规律是对 a 的结果应用其中一个counit或“映射”等价于恒等函数。counitcojoin

于 2013-06-22T12:37:39.403 回答