我正在尝试学习如何在Scala中执行单子代码,但是我想念Haskell将类型约束为声明函数类型的类型类的能力。

例如,我正在尝试从Scala中的replicateM编写类似Control.Monad的内容。如果不关心类型批注,它将类似于:

def replicateM(n: Int)(x: M[A]): M[List[A]] = n match {
  case 0 => map(x => List())
  case _ => for {
    head <- x
    tail <- replicateM(n-1)(x)
  } yield head: tail
}

(我看到这可能不是更有效的实现,这只是编写它的一种简单方法)。

我跌倒的地方是:如何在此处正确注释类型? M是什么类型?如何将M仅限于定义了flatMap的类型?感觉我可以用特质来做到这一点,但我不确定如何做到。

最佳答案

我认为,如果您要在Scala中寻找Haskell,则一定要看看scalaz。它已经具有copyM,Monad,Monoid,Monad变形金刚等等

  import scalaz._
  import Scalaz._

  println(Option(1).replicateM(10))

结果
Some(List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))

10-07 14:54