簡體   English   中英

Scala 2.8:將匿名函數的類型推斷作為默認參數

[英]Scala 2.8: type inference of anonymous functions as default parameters

在Scala 2.8.0 RC 2中這個定義:

  def buttonGroup[T](values: Array[T], textProvider: T => String = (t: T => t.toString)) = ...

給出錯誤消息:

找不到:值t

  def buttonGroup[T](values: Array[T], textProvider: T => String = (_.toString)) = ...

擴展函數缺少參數類型((x $ 1)=> x $ 1 {}。toString {}){}

只有這個有效:

 textProvider: T => String = (_:T).toString

為什么?

這些工作中的任何一個都沒有類型注釋:

def buttonGroup[T](values: Array[T], textProvider: T => String = (t: T) => t.toString) = 0

def buttonGroup[T](values: Array[T], textProvider: T => String = {t: T => t.toString}) = 0

但為什么你的變化不起作用?

第一個實際上在任何上下文中都不是有效的Scala:

scala> (t: Any => t.toString)
<console>:1: error: ';' expected but ')' found.
       (t: Any => t.toString))
                             ^

第二個表達式_.toString對匿名函數使用占位符語法,僅在表達式具有預期類型時才有效。

scala> def foo[T] = { (_.toString) : (T => String) }
foo: [T](T) => String

問題是類型取決於類型參數的參數的默認表達式沒有預期的類型。 這似乎違反直覺,為什么它不會將聲明的參數類型作為預期類型? 事實證明,表達式可以具有更具體的類型,並且類型檢查延遲到調用站點:

scala> def foo[T](t: T = "string-t") = t
foo: [T](t: T)T

scala> foo(1)
res4: Int = 1

scala> foo()
res5: java.lang.String = string-t

scala> foo[Int]()
<console>:7: error: type mismatch;
 found   : java.lang.String
 required: Int
Error occurred in an application involving default arguments.
       foo[Int]()

如果textProvider的類型不包含類型參數T ,則默認表達式具有預期類型,您可以使用占位符語法:

scala> def buttonGroup[T](values: Array[T], textProvider: Any => String = _.toString) = 0
buttonGroup: [T](values: Array[T],textProvider: (Any) => String)Int

有關命名和默認參數設計的詳細說明,我推薦Lucas Rytz的Scala Days演示文稿

暫無
暫無

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

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