再现哈斯克尔的行为';Scala中的s`replicateM`

再现哈斯克尔的行为';Scala中的s`replicateM`,scala,monads,traits,Scala,Monads,Traits,我试图学习如何在Scala中编写一元代码,但我错过了Haskell将类型约束为属于声明函数类型的类型类的能力 例如,我试图在Scala中从Control.Monad编写类似replicItem的东西。如果不考虑类型注释,这将类似于: def replicateM(n: Int)(x: M[A]): M[List[A]] = n match { case 0 => map(x => List()) case _ => for { head <- x

我试图学习如何在Scala中编写一元代码,但我错过了Haskell将类型约束为属于声明函数类型的类型类的能力

例如,我试图在Scala中从
Control.Monad
编写类似
replicItem
的东西。如果不考虑类型注释,这将类似于:

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
}
def replicateM(n:Int)(x:M[A]):M[List[A]=n匹配{
案例0=>map(x=>List())
案例=>用于{

head我认为如果你想在Scala中寻找Haskell,你肯定需要去看看。它已经有了replicateM、Monad、Monoids、Monad Transformers等等

  import scalaz._
  import Scalaz._

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

Some(List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))

嗯,这很好。但我仍然想自己实现这些东西,以便更好地理解Scala的类型系统。我喜欢通过自己实现来学习。但很高兴知道我可以在实际代码中使用scalaz。进一步的问题:scalaz对我自己定义的monad有效吗?我必须扩展一些特性来声明一个新的monad?Actually ReplicatItem是应用程序语法的一部分,而不是Monad。您可以查看scalaz源代码,了解它的实现方式。要为自定义类型M[u3;]创建Monad,您需要在作用域中包含隐式scalaz.Monad[M],因此是的,它非常容易扩展。