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