加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

斯卡拉 – Monads在实践中作为Monoids

发布时间:2020-12-16 18:14:30 所属栏目:安全 来源:网络整理
导读:我试图以更实际的方式理解monad和monoids之间的关系.如果这个问题毫无意义,我会提前道歉,我还在苦苦挣扎. 例如,假设我有: trait Monoid[T] { def zero: T def combine: (T,T) = T} 和(从here): trait Monad[+M[_]] { def unit[A](a: A): M[A] def bind[A,B
我试图以更实际的方式理解monad和monoids之间的关系.如果这个问题毫无意义,我会提前道歉,我还在苦苦挣扎.

例如,假设我有:

trait Monoid[T] {
  def zero: T
  def combine: (T,T) => T
}

和(从here):

trait Monad[+M[_]] {
  def unit[A](a: A): M[A]
  def bind[A,B](m: M[A])(f: A => M[B]): M[B]
}

是否可以在Monad和Monoid特征之间建立关系,例如我可以将Monad视为Monoid(假设我正确理解Monad是Monoid的特例)?

解决方法

如果使用unit并join而不是unit和bind编写monad,则可能会更容易看到连接:

trait Monoid[T] {
  def zero: T
  def combine: (T,T) => T
}

trait Monad[M[_]] {
  def unit[A]: A => M[A]
  def join[A]: M[M[A]] => M[A]
}

Join是Scala的flatten,bind是Scala的flatMap.

注意,为了仅通过使用单位和展平/连接来定义monad,还必须提供方法图[A](m:M [A])(f:A => B):M [B].这是因为monad实际上是一个(endo)仿函数,具有两个自然变换,单位和连接.由于它是一个仿函数,它具有地图功能.根据您的代码设计,map应该与unit一起定义并在Monad trait中加入,或者从一些Funad特征继承,这些特性将由Monad特征扩展.

为了完整起见,让我说明定义monad的所有三种可能方式:

>单位平面地图
>单位拼合地图
>单位撰写

所有这三个都可以使用另外两个中的一个来表达.我将跳过代码来演示这个,因为它与问题没有直接关系,但如果需要我可以在编辑中添加它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读