Scala comonads; Comonad法律?

时间:2013-06-22 03:14:42

标签: scala functional-programming category-theory comonad

所以鉴于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]]
        }

1 个答案:

答案 0 :(得分:4)

你快到了。 (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),法律是将counitcounit的“地图”应用于cojoin的结果}等同于身份函数。