def flatMap[A,B](f: Rand[A])(g: A => Rand[B]): Rand[B] =rng => {
val (a, r1) = f(rng)
g(a)(r1)
}
我很困惑g(a)(r1)
因为g应该只带一个参数,所以为什么r1?这个Scala函数是如何工作的?
def flatMap[A,B](f: Rand[A])(g: A => Rand[B]): Rand[B] =rng => {
val (a, r1) = f(rng)
g(a)(r1)
}
我很困惑g(a)(r1)
因为g应该只带一个参数,所以为什么r1?这个Scala函数是如何工作的?
我不完全知道Rand[A]
结构,所以这是部分猜测。你在这个函数中返回的是Rand[B]
,当你实现这个函数时,你首先定义一个匿名函数的参数rng
。这告诉我,Rand
本身可能是某种功能。
在第二行(val (a, r1) = f(rng)
)中,将值rng
应用于实例f: Rand[A]
。在结果元组中,a
的类型为A
。
请注意,f(rng)
等于明确呼叫apply
:f.apply(rng)
。
通过将此值应用于函数g
,可以使用值a
获取Rand[B]
。所以,val rb: Rand[B] = g(a)
(或g.apply(a)
)。
现在,你不想在这个匿名函数中返回Rand[B]
的实例!相反,您需要将以前的结果r1
应用于此实例rb
。所以,你得到rb(r1)
或rb.apply(r1)
。用rb
代替g(a)
或g.apply(a)
可得到g(a)(r1)
或g.apply(a).apply(r1)
。
总而言之,如您所说,g
应该只带一个参数,这会导致Rand[B]
的一个实例,但这不是预期的返回类型。您需要将上一次计算的结果应用于此新计算以获得预期结果。