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

将Haskell的Monadic绑定运算符添加到Scala

发布时间:2020-12-16 09:12:31 所属栏目:安全 来源:网络整理
导读:在 Haskell中,您可以使用bind运算符( =),如下所示: repli :: [a] - [a]repli xs = xs = x - [x,x]*Main repli [1,2,3][1,1,3,3] 我读过flatMap是Scala的绑定运算符: def repli [A](xs: List[A]): List[A] = xs.flatMap { x = List(x,x) }scala repli (Lis
在 Haskell中,您可以使用bind运算符(>> =),如下所示:

repli :: [a] -> [a]
repli xs = xs >>= x -> [x,x]

*Main> repli [1,2,3]
[1,1,3,3]

我读过flatMap是Scala的绑定运算符:

def repli [A](xs: List[A]): List[A] =
  xs.flatMap { x => List(x,x) }

scala> repli (List(1,3))
res0: List[Int] = List(1,3)

作为教学练习,我试图添加>> =支持Scala:

class MyList[T](list: List[T]) {
  def >>= [U](f: T => List[U]): List[U] = list.flatMap(f)
}
implicit def list2mylist[T](list: List[T]) = new MyList(list)

def repliNew [A](xs: List[A]): List[A] =
  xs >>= { x: A => List(x,x) }

scala> repliNew (List(1,3))
res1: List[Int] = List(1,3)

这完美无瑕,但仅适用于列表.我真的希望支持任何具有flatMap方法的类.什么是最好的方法呢?

解决方法

Scalaz如下:

trait MA[M[_],A] {
  def value: M[A]
  def >>=(f: A => M[B])(implicit m: Monad[M]): M[B] =
    m.bind(value,f)
}

从M [A]到MA [M,A]对于所有M [_]和A:

implicit def ma[M[_],A](m: => M[A]): MA[M,A] = new MA[M,A] {
  lazy val value = m
}

你只需要一个特质Monad和它的每个monad你关心的实例:

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

(编辑:李大同)

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

    推荐文章
      热点阅读