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

泛型 – Scala中的Monad特征

发布时间:2020-12-16 09:46:46 所属栏目:安全 来源:网络整理
导读:(如何)可以以通用的方式在Scala中表示单子(像Haskell中的Monad类型类)?为了这个目的而定义一个特征Monad是否有可能? 解决方法 你可以尝试这样的: trait Monad[+M[_]] { def unit[A](a: A): M[A] def bind[A,B](m: M[A])(f: A = M[B]): M[B]}// probably o
(如何)可以以通用的方式在Scala中表示单子(像Haskell中的Monad类型类)?为了这个目的而定义一个特征Monad是否有可能?

解决方法

你可以尝试这样的:

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

// probably only works in Scala 2.8
implicit def monadicSyntax[M[_],A](m: M[A])(implicit tc: Monad[M]) = new {
  private val bind = tc.bind(m) _

  def map[B](f: A => B) = bind(f compose tc.unit)

  def flatMap[B](f: A => M[B]) = bind(f)
}

implicit object MonadicOption extends Monad[Option] {
  def unit[A](a: A) = Some(a)

  def bind[A,B](opt: Option[A])(f: A => Option[B]) = opt flatMap f
}

你当然会为你心所欲的任何其他monad定义类似的隐含对象。在Haskell术语中,您可以将类型类和MonadicOption视为该类型类的特定实例。 monadicSyntax隐式转换简单地演示了如何使用这个类型类来允许使用Scala的理解来满足Monad类型类的任何内容。

一般来说,实现flatMap的Scala标准库中的大多数事情都是单子。 Scala没有定义一个通用的Monad类型类(虽然这样会很有用)。相反,它依赖于解析器的句法技巧,允许使用实现适当方法的任何内容来进行理解。具体来说,这些方法是map,flatMap和filter(或foreach和过滤命令式表单)。

(编辑:李大同)

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

    推荐文章
      热点阅读