2014-06-25 190 views
0

在下面,我有一個類CurryDefaultDemo在構造函數中帶有一個參數,並且該參數有一個默認值,它是一個curried函數。curried函數中的默認參數

scala> object Demo {            
    |               
    | type myF = String => Int         
    |               
    | def f(x: Int = 1)(y: String) = x + y.toInt       
    |               
    | }               
defined module Demo 

scala> import Demo._             
import Demo._               

scala> class CurryDefaultDemo(fun: myF = f()) 
defined class CurryDefaultDemo 

如由默認值f()f更換,我得到以下錯誤:

scala> class CurryDefaultDemo(fun: myF = f) 
<console>:11: error: type mismatch; 
found : String => Int 
required: Int 
     class CurryDefaultDemo(fun: myF = f) 
             ^

我知道f將是一個局部的功能String => Int。 「required:Int」來自哪裏?

回答

2

f既不是PartialFunction,部分應用的功能,甚至根本不是功能。 f是一種方法。 f有兩個參數列表,並要求調用IntString。如果您將f轉換爲函數(「eta-expand」),即f _,您將獲得類型爲Int => String => Int的咖喱函數。

現在,什麼是f()?由於只有一個圓括號列表,因此只應用第一個參數列表,並且由於沒有提供參數,所以它使用默認值,所以f()相當於f(1)。在CurryDefaultDemo的定義中,Scala知道這個表達式必須是myF,即String => Int,所以它創建了一個等同於x => f(1)(x)的函數。

爲什麼不明白f工作?那麼,斯卡拉看到你想要一個myF,這是一種功能,所以它試圖eta-擴大f,得到一個Int => String => Int,這是一個函數返回類型String => Int,它不匹配返回類型Int一個myF必須有。