Scala-状态操作-Scala练习中的FP第6章-FlatMap的评估

Scala-状态操作-Scala练习中的FP第6章-FlatMap的评估,scala,functional-programming,Scala,Functional Programming,从Scala中的函数编程中实现map2的FlatMap时,我很难分解第6.9节中的评估 所以map2看起来像 def map2[A,B,C](ra: Rand[A], rb: Rand[B])(f: (A, B) => C): Rand[C] = { rng => { val (a, r1) = ra(rng) val (b, r2) = rb(r1) (f(a, b), r2) } } flatMap看起来像: def flatMap[A, B](

从Scala中的函数编程中实现map2的FlatMap时,我很难分解第6.9节中的评估

所以map2看起来像

def map2[A,B,C](ra: Rand[A], rb: Rand[B])(f: (A, B) => C): Rand[C] = {
  rng => {
    val (a, r1) = ra(rng)
    val (b, r2) = rb(r1)
    (f(a, b), r2)
  }
}
flatMap看起来像:

def flatMap[A, B](f: Rand[A])(g: A => Rand[B]): Rand[B] = rng => {
  val (a, r1) = f(rng)
  g(a)(r1)
}
我用头撞了几天墙,弄不懂如何用平面图来绘制map2(奇怪的是,map马上就来了)

从solutions repo的flatMap来看map2的解决方案:

def _map2[A,B,C](s1: Rand[A], s2: Rand[B])(f: (A, B) => C): Rand[C] = {
  flatMap(s1)(a => flatMap(s2)(b => unit(f(a,b))))
}
但我对这个函数在求值方面是如何扩展的感到困惑——我似乎无法手工写出求值结果。我看不出第二个f:(A,B)=>C如何返回到外部平面图


我想这是这篇文章之后的下一个问题:

要使
Rand
起作用,必须为生成的每个伪随机值“递增”输入种子。如果使用同一种子两次从
Rand[X]
中拉出两个
X
s,则这两个
X
s将是相同的。
Rand
monad的“效果”是为您“增加”这个种子
map2
接受三个参数:
Rand[A]
Rand[B]
和一个函数
(A,B)->C
map2
必须生成伪随机
A
B
,然后才能应用函数
(A,B)->C
map2
生成
A
,增加种子,然后生成
B
,增加种子,然后应用函数
(A,B)->C
.100%。这在最初的map2实现中是很清楚的。我不知道scala如何扩展使用flatMap的
\u map2
函数。我想这更像是Scala如何评估上述内容的问题。如果我从里到外,看起来f(a,b)是先展开的,但不清楚,因为a和b还没有生成。我不清楚两个
flatMap
中哪一个是第一个增加种子并通过状态的。好的,我想我现在明白了,谢谢。看看这些:这是
RNG
特性的一个伪实现,它只增加种子1.Ah。啊!!非常感谢。这是我一整天都想看到的突破。