接收"缺少参数类型"在函数文字上使用下划线作为输入参数时

时间:2016-09-21 16:56:19

标签: scala parameters function-literal

我有一个带有通用参数的trait,其中包含一个方法,我尝试将默认实现定义为"空"。

trait MetaBase[T <: Throwable] {
  ...
  def riskWithEvent[V](
    vToEvaluate: => V,
    failureTEvent: FailureBase[T, V] => Unit = _ => ()
  ): TryBase[T, V] =
    ...
}

我收到的&#34;缺少参数类型&#34; failureTEvent: FailureBase[T, V] => Unit =之后右下角的错误。我无法弄清楚如何让Scala编译器在那时不必知道类型信息,因为它没有被使用或需要。

我考虑过将参数更改为:

failureTEvent: Option[FailureBase[T, V] => Unit] = None

但是,我不喜欢客户现在必须将其功能包装在Some()中。我更倾向于允许它们不指定参数,或者在没有包装器的情况下指定参数。

非常感谢任何有关此事的指导。

1 个答案:

答案 0 :(得分:3)

实际上,V param会遇到问题。

以下是-Ylog:typer -Ytyper-debug

|    |    |    |    |    |-- ((x$1) => ()) : pt=FB[T,?] => Unit BYVALmode-EXPRmode (site: value g in MB) 
<console>:13: error: missing parameter type
       trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
                                                                 ^
|    |    |    |    |    |    \-> <error> => Unit

或者,

scala> case class FB[T, V](t: T, v: V)
defined class FB

这有效:

scala> trait MB[T <: Throwable, V] { def f(g: FB[T, V] => Unit = _ => ()): Unit = () }
defined trait MB

这不是:

scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
<console>:13: error: missing parameter type
       trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = _ => ()): Unit = () }
                                                                 ^

或者只需要Any,因为在arg中函数是反变量的:

scala> trait MB[T <: Throwable] { def f[V](g: FB[T, V] => Unit = (_: Any) => ()): Unit = () }
defined trait MB

与默认arg输入相关的其他链接:

https://issues.scala-lang.org/browse/SI-8884

https://issues.scala-lang.org/browse/SI-7095

Scala case class.type does not take parameters