这个Scala函数如何工作?

时间:2017-05-25 10:42:56

标签: 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?

1 个答案:

答案 0 :(得分:1)

我不完全了解Rand[A]结构,所以这是部分猜测。您在此函数中返回的是Rand[B],当您实现该函数时,您将开始定义匿名函数的参数rng。这告诉我Rand本身可能是某种功能。

在第二行(val (a, r1) = f(rng))中,您将值rng应用于实例f: Rand[A]。在生成的元组中,a的类型为A

请注意,f(rng)等于明确调用applyf.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]的实例,但这不是预期的返回类型。您需要将先前计算的结果应用于此新计算以获得预期结果。