代码在这里:https : //github.com/fpinscala/fpinscala/blob/master/answers/src/main/scala/fpinscala/state/State.scala
def simulateMachine(inputs: List[Input]): State[Machine, (Int, Int)] = for {
_ <- sequence(inputs map ((modify[Machine] _) compose update))
s <- get
} yield (s.coins, s.candies)
Run Code Online (Sandbox Code Playgroud)
我不明白第二行在s <- get这个理解中是如何工作的。
据我所知,第一行创建了一个 State[Machine, List[Unit]] 并且 flatMap 用 _ 丢弃了 List[Unit]。
随后,在第二行中,我不明白如何get应用于Machine第一行中的创建。怎么Machine传下去?
编辑:
感谢 jwvh 和 Markus Appel 的答复,我现在知道这get是一个没有参数的方法,它返回一个State[S, S].
现在我想我明白了,但如果我错了,请纠正我。首先,我扩展了理解如下。
sequence(inputs map ((modify[Machine] _) compose update))
.flatMap(_ => get
.map(s => (s.coins, s.candies))
Run Code Online (Sandbox Code Playgroud)
get.map(s => (s.coins, s.candies)可以用 …
我正在阅读,Functional Programming in Scala并且有书评论说,monad的flatMap必须遵循以下关联性法则。
x.flatMap(f).flatMap(g) == x.flatMap(a => f(a).flatMap(g))
我通常以关联性来表示类似(a+(b+c))==的意思,((a+b)+c)但是我无法将此处的方程式转换成类似的意思。
双方似乎等同于我。假设x是类型M[A],它们似乎都首先应用f到a随后flatMap(g)的结果f(a)。
这部法律的意义是什么?