2012-11-16 52 views
0

我試圖從Scala in Depth在REPL運行下面的代碼片段:什麼是錯的VAL NOTNULL [T]:T =>布爾= _ =從斯卡拉空的深度

val notNull[T]: T => Boolean = _ != null 

的解釋丟給我以下錯誤:

<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.$bang$eq(null)) 
     val notNull[T]: T => Boolean = _ != null 
            ^
<console>:7: error: not found: type T 
     val notNull[T]: T => Boolean = _ != null 
        ^
<console>:7: error: not found: type notNull 
     val notNull[T]: T => Boolean = _ != null 
     ^
<console>:7: error: not found: type T 
     val notNull[T]: T => Boolean = _ != null 
       ^

scala> val notNull[T](f1: T => Boolean) = _ != null 
<console>:1: error: ')' expected but '=>' found. 
     val notNull[T](f1: T => Boolean) = _ != null 

也許我不理解這裏的發言,但不是從書基本上說,聲明它返回一個函數,T作爲參數,返回類型T的VAL NOTNULL聲明一個布爾值。 `_! = null通過獲取參數並將其與null進行比較來執行該函數,實質上返回一個布爾值?

爲什麼編譯器在這裏拋出所有這些錯誤?

回答

3

它需要是def工作。 Val's不能像這樣一般地打字。這可能是因爲val是Function1的一個實例,並且類的實例需要具有實際的類型。

def notNull[T]: T => Boolean = _ != null 

當你像上面那樣調用NOTNULL時,它實際上會返回一個function1實例。

scala> val a = notNull[String] 
a: (String) => Boolean = <function1> 

scala> a(null) 
res5: Boolean = false 

scala> a("aa") 
res6: Boolean = true 

scala> a(5) 
<console>:10: error: type mismatch; 
found : Int(5) 
required: String 
     a(5) 
     ^

我認爲這說明了爲什麼val不能一般輸入。

+1

Vals可以(並且總是)鍵入,而'Function1'對於'val'來說是一個非常正常的類型。他們不能的是_generic_(即有'[T]''的類型參數)。 –

+0

錯誤的權利,多數民衆贊成我打字的意思 - 我原本是一般打字 - 但困惑於確切的術語。謝謝。 –