簡體   English   中英

“推斷函數中使用的類型是文字”嗎?

[英]“Infer the types used in a function are literals”?

在“深度縮放”中有一個示例,作者在其中說明了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推斷為布爾值?

是筆者說,不需要指定aBooleanmyMethod({a => true})因為該類型是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)

作者是否要說編譯器將函數參數a推斷為布爾值?

絕對。 給出以下方法:

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類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM