我正在尝试学习如何在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))