gpt4 book ai didi

scala - 将 Haskell 的 Monadic 绑定(bind)运算符添加到 Scala

转载 作者:行者123 更新时间:2023-12-04 00:40:26 26 4
gpt4 key购买 nike

在 Haskell 中,您可以像这样使用绑定(bind)运算符 (>>=):

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

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

我读过 flatMap是 Scala 的绑定(bind)运算符:
def repli [A](xs: List[A]): List[A] =
xs.flatMap { x => List(x,x) }

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

作为教学练习,我正在尝试添加对 >>= 的支持。对斯卡拉:
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,2,3))
res1: List[Int] = List(1, 1, 2, 2, 3, 3)

这非常有效,但仅适用于列表。我真的很想用 flatMap 支持任何类(class)方法。解决这个问题的最佳方法是什么?

最佳答案

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]
}

关于scala - 将 Haskell 的 Monadic 绑定(bind)运算符添加到 Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5436177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com