斯卡拉 – 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的所有三种可能方式: >单位平面地图 所有这三个都可以使用另外两个中的一个来表达.我将跳过代码来演示这个,因为它与问题没有直接关系,但如果需要我可以在编辑中添加它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |