【发布时间】:2017-10-11 02:26:43
【问题描述】:
我正在尝试使用 Scala 和 Cats 以函数式方式链接一些顺序操作。它们分别看起来很完美,但我不确定现在如何使用 flatMap / 将它们链接起来以便理解。
所以,比方说,我有类似的东西
import cats.data.State
object Step1 {
def apply() = State[String, Seq[String]] { text =>
val ans = text.trim.split("""[\s]+""").toSeq
(text, ans)
}
}
println(Step1().run("Lorem Ipsum Dolor").value)
object Step2 {
def apply() = State[Seq[String], Seq[String]] { terms =>
val ans = terms.map(_.toLowerCase)
(terms, ans)
}
}
println(Step2().run(Seq("Lorem", "Ipsum", "Dolor")).value)
理想情况下,我想要类似的东西
for {
a <- Step1()
b <- Step2()
} yield (b)
实现这一目标的最佳方法是什么?
【问题讨论】:
-
如果返回与给定相同的状态,为什么还需要状态单子?这些对我来说看起来很简单。
-
除了 Cyrille 所说的之外,您的两个计算具有不同类型的状态,因此它们本身不兼容。您的示例看起来更像您有函数
f1: String => Seq[String和f2: Seq[String] => Seq[String]并且正在寻找组合f1 andThen f2。
标签: scala monads scala-cats