Scala 中的函数式编程练习 6.11。这种理解是如何工作的?

Yar*_*ner 5 scala

代码在这里: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)可以用State(s => (s, s)).map(s => (s.coins, s.candies)和最终代替State(s => (s, (s.coins, s.candies)))

sequence(inputs map ((modify[Machine] _) compose update))
    .flatMap(_ => State(s => (s, (s.coins, s.candies))))
Run Code Online (Sandbox Code Playgroud)

sequence(inputs map ((modify[Machine] _) compose update)).flatMap用定义代替外部,我明白了

State(s => {
    val (a, s1) = sequence(inputs map ((modify[Machine] _) compose update)).run(s)
    f(a).run(s1)
  })
Run Code Online (Sandbox Code Playgroud)

现在我f(a)用一个评价代替_ => State(s => (s, (s.coins, s.candies)))

State(s => {
    val (a, s1) = sequence(inputs map ((modify[Machine] _) compose update)).run(s)
    State(s => (s, (s.coins, s.candies))).run(s1)
  })
Run Code Online (Sandbox Code Playgroud)

本质上,在执行输入列表后,在最终状态下sequence(inputs map ((modify[Machine] _) compose update))生成 aMachine并生成类型为 的输出State[Machine, List[Unit]]。但是Machine这个状态内的实际没有明确传递。相反,它flatMap在调用State(s => (s, (s.coins, s.candies))).run(s1)via时根据定义隐式传递.run(s1)

Mar*_*pel 1

正如 @jwvh 已经指出的那样,get是 中定义的方法object State。-方法get既不应用于任何Machine也不用作Machine参数,因为该函数具有以下签名:

def get[S]: State[S, S] = State(s => (s, s))
Run Code Online (Sandbox Code Playgroud)

这意味着get没有参数,返回类型为State[S, S]