簡體   English   中英

Scala語法幫助咖喱

[英]Scala Syntax Help Currying

我在scala中以類似的形式遇到了一些代碼,如下所示:

  def test1(f : Int => Int)(x : Int) = x + f(x)

  def test2(f : Int => Int)(x : Int) = f(x)

  test2(test1(x => 2*x))(2)

我很困惑,所以函數test1將一個函數和一個Int作為參數,然后返回一個函數,對嗎? 那么test1(x => 2*x)如何有效並將函數返回給test2? 顯然,它需要2作為整數參數,但是為什么呢? 語句test2(test1(x => 2*x))(2)擴展?

提前致謝。

函數test1將一個函數和一個Int作為參數,然后返回一個函數,對嗎?

不,它僅將函數作為參數並返回一個函數。 然后,返回的函數將int作為參數並返回int。

那么test1(x => 2 * x)如何有效並將函數返回給test2?

我希望現在很清楚。

語句test2(test1(x => 2 * x))(2)如何擴展?

使用x => 2*x作為參數調用test1並返回一個函數。 然后以返回的函數作為參數調用test2並返回另一個函數。 然后使用2作為參數調用另一個函數。

這個:

test2(test1(x => 2*x))(2)

擴展為:

test2(y => test1(x => 2*x)(y))(2)

Scala具有多個參數列表的方法可以像其他語言中的咖喱函數一樣工作,但實際上是作為需要其所有參數的方法實現的,這確實在語法中得以體現。 例如,如果將其放入REPL中:

test1(x => 2*x)

它將抱怨缺少論據。 此語法允許的是“ eta擴展”,其中方法被轉換為函數。 如果您寫:

val func: Int => Int = test1(x => 2*x) _

您可以獲得代表部分應用的test1的函數。 如果上下文需要,Scala將自動執行eta擴展,這就是test2(test1(x => 2*x))(2) 請注意, test1本身從不返回函數,但編譯器將在需要時基於該函數構建函數。

但是,如果您像這樣定義test1

def test1(f : Int => Int) = (x : Int) => x + f(x)

然后,編譯器將接受不帶_ test1(x => 2*x) 同樣,在基礎實現中,只有一個類實現由test1處理的閉包,而對於原始定義, test1每個部分應用都會為其創建一個新類。 另一方面,給定兩個參數時效率較低,因為總是創建閉包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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