与Scala猫的链状态monad

时间:2017-05-11 22:08:50

标签: scala monads 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)

实现这一目标的最佳方法是什么?

1 个答案:

答案 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