簡體   English   中英

Scala 中的函數式編程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM