Получение "пропущенного типа параметра" при использовании подчеркивания для входного параметра в функциональном литерале

У меня есть 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

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

Scala case class.type не принимает параметры

Другие вопросы по тегам