这个Scala函数是如何工作的?
我对这个Scala函数是如何工作的?,scala,Scala,我对g(a)(r1)感到困惑,因为g应该只接受一个参数,那么为什么是r1?我不知道Rand[a]结构,所以这只是部分猜测。在这个函数中返回的是aRand[B],当您实现这个函数时,首先要定义一个匿名函数的参数rng。这告诉我,Rand可能是某种函数本身 在第二行(val(a,r1)=f(rng))中,将值rng应用于实例f:Rand[a]。在生成的元组中,a具有类型a 请注意,f(rng)等于显式调用apply:f.apply(rng) 通过将该值应用于函数g,可以使用值a获得Rand[B]。因
g(a)(r1)
感到困惑,因为g应该只接受一个参数,那么为什么是r1?我不知道Rand[a]
结构,所以这只是部分猜测。在这个函数中返回的是aRand[B]
,当您实现这个函数时,首先要定义一个匿名函数的参数rng
。这告诉我,Rand
可能是某种函数本身
在第二行(val(a,r1)=f(rng)
)中,将值rng
应用于实例f:Rand[a]
。在生成的元组中,a
具有类型a
请注意,f(rng)
等于显式调用apply
:f.apply(rng)
通过将该值应用于函数g
,可以使用值a
获得Rand[B]
。因此,valrb:Rand[B]=g(a)
(或g.apply(a)
)
现在,您不想在这个匿名函数中返回Rand[B]
的实例!相反,您需要将前面的结果r1
应用于此实例rb
。因此,您将得到rb(r1)
或rb.apply(r1)
。用g(a)
或g.apply(a)
替换rb
将为您提供g(a)(r1)
或g.apply(a).apply(r1)
总之,正如您所说,g
应该只接受一个参数,这将导致一个Rand[B]
的实例,但这不是这里期望的返回类型。您需要将先前计算的结果应用于此新计算,以获得预期结果
def flatMap[A,B](f: Rand[A])(g: A => Rand[B]): Rand[B] =rng => {
val (a, r1) = f(rng)
g(a)(r1)
}