Получение "пропущенного типа параметра" при использовании подчеркивания для входного параметра в функциональном литерале
У меня есть trait
с общими параметрами, который содержит метод, в котором я пытаюсь определить реализацию по умолчанию как "пустую".
trait MetaBase[T <: Throwable] {
...
def riskWithEvent[V](
vToEvaluate: => V,
failureTEvent: FailureBase[T, V] => Unit = _ => ()
): TryBase[T, V] =
...
}
Я получаю сообщение об ошибке "отсутствует тип параметра" в подчеркивании сразу после failureTEvent: FailureBase[T, V] => Unit =
, Я не могу понять, как заставить компилятор Scala отказаться от необходимости знать информацию о типе в тот момент, когда она не используется или не нужна.
Я подумал об изменении параметра на:
failureTEvent: Option[FailureBase[T, V] => Unit] = None
Однако мне не нравится, что клиенты должны теперь обернуть свою функцию в Some()
, Я бы предпочел позволить им не указывать параметр или указывать параметр без оболочки.
Любое руководство по этому вопросу высоко ценится.
1 ответ
На самом деле, это имеет проблемы с V
пары.
Вот -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
Другие ссылки, связанные с набором текста по умолчанию:
https://issues.scala-lang.org/browse/SI-8884