我無法解釋指定爲沒有LHS(左手側)的函數參數的「double-rightarrow Type」。 () => Int
從()
到Int
但是=> Int
是什麼意思? 例如請參閱下面的foo
方法的第一個參數,f
的類型是什麼?是(Int,() => Int) => Int
?在函數參數中沒有LHS平均值的「雙向右箭頭類型」什麼是
對於bar
的定義,其中y是按名稱傳遞的,我將它解釋爲一個沒有參數的函數,該參數將生成一個Int,它看起來等同於baz
的定義。
我可以嘗試有理由相信,在f
需要foo
第二個參數爲呼叫的名字,而不是來自() => Int
但就是矛盾這一事實,bar
和baz
定義在javap的相同。我錯過了什麼?
object ParamTest {
def foo(f: (Int, => Int) => Int, x: Int) : Int = 10
def bar(x: Int, y: => Int) : Int = 20
def baz(x: Int, f:() => Int) : Int = 30
def qux(f: (Int,() => Int) => Int, x: Int) : Int = 40
}
爲了測試我編譯上述類scalac ParamTest.scala
javap ParamTest
給我:
public final class ParamTest {
public static int qux(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
public static int baz(int, scala.Function0<java.lang.Object>);
public static int bar(int, scala.Function0<java.lang.Object>);
public static int foo(scala.Function2<java.lang.Object, scala.Function0<java.lang.Object>, java.lang.Object>, int);
}
這似乎表明,foo和qux具有相同的方法簽名。換句話說,我可以解釋=> Int
爲() => Int
,但 foo(baz,100)
給了我一個類型不匹配錯誤
scala> import ParamTest._
import ParamTest._
scala> foo(bar,100)
res0: Int = 10
scala> foo(baz,100)
<console>:11: error: type mismatch;
found : (Int,() => Int) => Int
required: (Int, => Int) => Int
foo(baz,100)
^
編輯:這是不一樣的this question。我不是問call-by-name: => Type
和() => Type
之間的實際區別。內部知道我知道的更有趣。 scala如何區分兩者,當javap或cfr decompilation給出foo
和qux
的相同定義時;併爲bar
和baz
。
謝謝,我很感謝你的解釋。你知道我在哪裏可以找到更多關於Scala規範的細節嗎?我試着通過[4.6節](http://www.scala-lang.org/files/ archive/spec/2.11/04-basic-declarations-and-definitions.html),但是如果沒有LHS的副名參數:(但至少我的混淆被清除了,所以我可以繼續前進 – vsnyc
嗯,我不知道斯卡拉規範,但還有其他方法可以獲得這些信息,正如已經指出的那樣,搜索已經被問到的問題是一個很好的開始,另外,在Scala中編程「(第1版)可在[在線](http://www.artima.com/pins1ed/)。除此之外,還有許多博客文章。將一些術語插入搜索引擎併爲有用的書籤添加書籤。 – jwvh
我已經閱讀了端到端的[本教程](http://www.scala -lang.org/docu/files/ScalaByExample.pdf),並完成了他在Coursera的前兩門課程。我想知道的是,在兩種情況下,當反編譯類文件時,Scala如何區分'()=> A'和'=> A'兩種類型。但這個問題還不夠清楚,所以我會問一個新問題。你肯定幫助了懶惰的評估部分。 – vsnyc