再现哈斯克尔的行为';Scala中的s`replicateM`
我试图学习如何在Scala中编写一元代码,但我错过了Haskell将类型约束为属于声明函数类型的类型类的能力 例如,我试图在Scala中从再现哈斯克尔的行为';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
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],因此是的,它非常容易扩展。