gpt4 book ai didi

Scala Cats State Monad

转载 作者:行者123 更新时间:2023-12-04 15:29:22 25 4
gpt4 key购买 nike

我有一个类,它有一个单参数方法,它产生一个结果并返回一个像它自己一样的对象,但具有更新的状态以供后续使用。

例如,下面包含这样一个类的简单示例以及我如何使用它:

case class Foo(x: Double) {
def bar(y: Double): (Foo, Double) = (Foo(x + y), x / (x + y))
}

val res = Vector(1.0,2.0,3.0,4.0).foldLeft((Foo(0), 0.0))((foo, x) => foo._1.bar(x))

res._1.bar(3.0)

我已经查看了 Cats State monad 并希望我可以使用它来避免将状态(“x”成员)串起来。示例 here与我想要的很接近,但返回新状态的函数没有任何参数,并且状态不会在类似循环的操作中传递(而是在表达式之间传递)。说到猫,我是一个完全的新手,但我是不是找错了树?

最佳答案

您可以在下面找到如何根据您的情况调整猫状态 monad 的方法。但是我在排序时遇到了一些问题 List[State[S, A]]State[S, List[A]]在猫中,所以我写了一个函数 sequence为了那个原因。如果有人知道怎么做,我会感兴趣的:)

import cats.data._

case class Foo(x: Double)

def bar(y: Double): State[Foo, Double] = for {
foo <- State.get[Foo]
_ <- State.set(Foo(foo.x + y))

} yield foo.x / (foo.x + y)

val xs: List[State[Foo, Double]] = List(1.0, 2.0, 3.0, 4.0).map(bar)

def sequence(xs: List[State[Foo, Double]]): State[Foo, List[Double]] =
xs.foldLeft(State.pure[Foo, List[Double]](List.empty[Double])) { (acc, x) =>
for {
xs <- acc
xx <- x
} yield xx :: xs
}

val s = sequence(xs)
val ss = s.map(_.head)

s.run(Foo(0)).value
ss.run(Foo(0)).value

ss.flatMap(_ => bar(3)).run(Foo(0)).value

结果你得到
res0: (Foo, List[Double]) = (Foo(10.0),List(0.6, 0.5, 0.3333333333333333, 0.0))
res1: (Foo, Double) = (Foo(10.0),0.6)

res2: (Foo, Double) = (Foo(13.0),0.7692307692307693)

关于Scala Cats State Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com