gpt4 book ai didi

scala - 在 Scala 中重新创建 Haskell 的 `replicateM` 的行为

转载 作者:行者123 更新时间:2023-12-01 10:45:37 25 4
gpt4 key购买 nike

我正在尝试学习如何在 Scala 中编写单子(monad)代码,但我想念 Haskell 将类型限制为属于声明函数类型的类型类的能力。

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

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 .它已经有 replicateM、Monads、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 - 在 Scala 中重新创建 Haskell 的 `replicateM` 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637039/

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