繁体   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