【问题标题】:Scala 2.8: type inference of anonymous functions as default parametersScala 2.8:匿名函数的类型推断作为默认参数
【发布时间】:2011-02-21 18:53:33
【问题描述】:

在 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

为什么?

【问题讨论】:

    标签: scala scala-2.8 named-parameters


    【解决方案1】:

    这些都可以工作,没有类型注释:

    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 presentation

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多