2012-11-16 36 views
0

「Scala in Depth」中有一個例子,作者正在解釋scala如何對傳入方法的參數進行一定程度的推理。作爲一個例子顯示如下:「推斷函數中使用的類型是文字」?

def myMethod(functionLiteral: A => B):Unit 
myMethod({ arg:A => new B}) 
myMethod({ arg => new B}) 

只是爲了找出作者在談論,我中REPL如下:

def myMethod(functionLiteral: Boolean => Boolean):Unit = {} 
myMethod({a:Boolean => true}) 
myMethod({a => true}) 

這裏發生的唯一啓示的是,編譯器不會拋出錯誤。

作者是否試圖說函數參數a被編譯器推斷爲布爾值?

回答

2

是筆者說,不需要指定amyMethod({a => true})一個Boolean,因爲該類型Boolean => Boolean

==原來的答覆,這使得第一位編譯,但忽略了一點有點==

需要輸入[A,B]

def myMethod[A,B](functionLiteral: A => B): Unit = {} 
myMethod((arg:String) => arg.length) 
myMethod((arg:Int) => (1 to arg).map(_ *2)) 

我修改它以返回函數,以便您可以看到repl中的類型。

scala> def myMethod[A,B](functionLiteral: A => B): A => B = functionLiteral 
myMethod: [A, B](functionLiteral: (A) => B)(A) => B 

scala> myMethod((arg:String) => arg.length) 
res11: (String) => Int = <function1> 

scala> res11("hello world!") 
res12: Int = 12 

scala> myMethod((arg:Int) => (1 to arg).map(_ *2)) 
res13: (Int) => scala.collection.immutable.IndexedSeq[Int] = <function1> 

scala> res13(4) 
res14: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8) 
+0

這是如何回答關於推論的問題? –

+0

啊你是對的。我感到困惑的是,它是無法編譯的代碼,會更新答案。 –

2

是筆者想說的是,函數的參數被推斷爲編譯器布爾?

絕對。 考慮以下方法:

def myMethod(functionLiteral: Boolean => Boolean):Unit = {} 

編譯器知道的參數myMethod是一個函數,它接受一個布爾值參數,所以它並不需要你指定它。換句話說,在下面的a是明確的布爾參數:

myMethod{a => true} 

現在,值得注意的是,當超載混合這不工作了:

def myMethod(functionLiteral: Boolean => Boolean):Unit = {} 
def myMethod(functionLiteral: Int => Boolean):Unit = {} 
myMethod{a => true} // error: missing parameter type 

的原因是,它不能明確地告訴aBoolean還是Int