我正在尝试使用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)
实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
记下您的类型:
对于Step1
,您有State[String, Seq[String]]
。
对于Step2
,您有State[Seq[String], Seq[String]]
。
函数flatMap
接受M[A]
和A => M[B]
的参数并返回M[B]
但显然是M[_]
Step1
和{{} 1}}明显不同,即使它们都使用Step2
数据类型。
请注意,State
的类型签名为State
,或类似* -> * -> *
,其中State[S, A]
是您的状态&#34; S
是你的价值。
在这种情况下,如果你真的想要A
两个不同的flatMap
,那么你必须先调整&#34;调整&#34;并等同其中一个的State
。