簡體   English   中英

Scala貓的鏈狀狀態單子

[英]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]但顯然,即使Step1Step2 M[_]都使用State數據類型,它們也明顯不同。

請注意, State具有* -> * -> *的類型簽名,或者看起來像State[S, A] ,其中S是您的“狀態”,而A是您的值。

在這種情況下,如果你真的想flatMap兩個不同的State ,那么你必須先“調整”和等同的S其中之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM