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?
答案 0 :(得分:1)
我不完全了解Rand[A]
结构,所以这是部分猜测。您在此函数中返回的是Rand[B]
,当您实现该函数时,您将开始定义匿名函数的参数rng
。这告诉我Rand
本身可能是某种功能。
在第二行(val (a, r1) = f(rng)
)中,您将值rng
应用于实例f: Rand[A]
。在生成的元组中,a
的类型为A
。
请注意,f(rng)
等于明确调用apply
:f.apply(rng)
。
您可以使用值a
通过将此值应用于函数Rand[B]
来获取g
。所以,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]
的实例,但这不是预期的返回类型。您需要将先前计算的结果应用于此新计算以获得预期结果。