首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala comonads;Comonad法律?

Scala comonads;Comonad法律?
EN

Stack Overflow用户
提问于 2013-06-22 11:14:42
回答 1查看 338关注 0票数 4

那么,鉴于comonad的这种编码(见下文),上面的comonad法则是正确的吗?出于某种原因,我不认为他们是因为看了他们,我知道从那里走错了路只会产生糟糕的道路,所以我会感谢你的推动,暗示,帮助,回答你所拥有的。

代码语言:javascript
运行
复制
      /**
       * 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]]
        }
EN

回答 1

Stack Overflow用户

发布于 2013-06-22 20:37:39

你就快到了。(i)(iii)都是正确的,但(ii)是错误的。您可以发现错误,因为(ii)的类型不正确:对于>>(counit(m),参数counit(m)的类型是A,而不是M[A]

您的操作的正确法则是:

代码语言:javascript
运行
复制
   * (i)   counit(cojoin(m))      == m
   * 
   * (ii)  >>(cojoin(m))(counit)  == m
   * 
   * (iii) cojoin(cojoin(m))      == >>(cojoin(m))(cojoin)

因此,对于(i)(ii),法则是将counitcounit的“映射”应用于cojoin的结果等价于标识函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17247004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档