Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个Scala函数是如何工作的?_Scala - Fatal编程技术网

这个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]
结构,所以这只是部分猜测。在这个函数中返回的是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]
。因此,
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) 
}