[英]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.