[英]Functional Programming in Scala
我的問題是關於 Unit6.4 中的 Lambda
trait RNG {
def nextInt: (Int, RNG)
}
type Rand[+A] = RNG => (A, RNG)
val int: Rand[Int] = _.nextInt
為什么"_.nextInt"
可以等於"x => x.nextInt"
。
在 Java8 中, (RNGr) -> r.nextInt()
可以像RNG::nextInt
(一個函數引用)一樣替換。
所以我想了解"_.nextInt"
和"RNG::nextInt"
之間有什么區別,以及為什么"val int: Rand[Int] = x.nextInt"
, "x" 不能匹配 RNG 但"_"
可以.
類型別名
Rand[Int]
根據定義代表類型
RNG => (Int, RNG)
由於您將值int
聲明為Rand[Int]
類型,編譯器希望在右側看到RNG => (Int, RNG)
類型的函數。
右手邊是
_.nextInt
這是一個語法糖快捷方式
ф => ф.nextInt
與一些合成變量ф
。
由於已知此函數的預期類型為RNG => (Int, RNG)
,因此可以假定參數ф
的類型為RNG
:
(ф: RNG) => ф.nextInt
由於對於ф: RNG
表達式ф.nextInt
已知具有類型(Int, RNG)
,因此函數文字的類型與預期類型RNG => (Int, RNG)
匹配。
同時,定義
val int: Rand[Int] = x.nextInt
沒有意義,因為它包含一個未定義的符號x
。
Java 8 為 lambda 提供了特殊的快捷方式,可以簡單地調用對象上的一些方法。 您的特定用例由對特定類型的任意對象的實例方法的引用涵蓋,給定類定義
class Foo {
public Bar bar() { .... }
}
允許您替換 lambda
(Foo f) -> f.bar()
剛剛
Foo::bar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.