[英]Chain State monads with Scala Cats
我正在尝试使用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)
实现此目标的最佳方法是什么?
注意您的类型:
对于您的Step1
,您具有State[String, Seq[String]]
。 对于您的Step2
,您需要拥有State[Seq[String], Seq[String]]
。
函数flatMap
接受M[A]
和A => M[B]
并返回M[B]
但显然,即使Step1
和Step2
M[_]
都使用State
数据类型,它们也明显不同。
请注意, State
具有* -> * -> *
的类型签名,或者看起来像State[S, A]
,其中S
是您的“状态”,而A
是您的值。
在这种情况下,如果你真的想flatMap
两个不同的State
,那么你必须先“调整”和等同的S
其中之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.