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]
的一個實例,但這不是預期的返回類型。您需要將上一次計算的結果應用於此新計算以獲得預期結果。