В Scala, как обойти ошибку «аргументы предполагаемого типа не соответствуют»?

У меня есть отражающая функция с неявным параметром TypeTag:

def fromOptionFn[R: TypeTag](self: Int => Option[R]): Wrapper[R] = {
println(TypeTag[R])
...
}

Что по неизвестной причине не работает (см. -parame">Как сделать вывод типа Scala достаточно мощным, чтобы обнаружить параметр универсального типа?):

> fromOptionFn2(v => Some(" + _))
> typeTag(Any)

Я предполагаю, что это вызвано выводом R из Option[R], поэтому я немного улучшаю его:

def fromOptionFn[R, Opt <: Option[R]: TypeTag](self: Int => Opt): Wrapper[R] = {
println(typeTag[Opt])
...
}

На этот раз все еще хуже, даже не компилируется, ошибка явно указывает на то, что scala недостаточно умен для анализа типа:

> fromOptionFn2(v => Some(" + _))
Error: inferred type arguments [Nothing,Option[String]] do not conform to method fromOptionFn's type parameter bounds [R,Opt <: Option[R]]

Итак, как мне временно обойти эту проблему компиляции? (Конечно, я могу сообщить об этом на трекере Lightbend, но это слишком медленно)

ДОПОЛНЕНИЕ. Эта проблема сама по себе является попыткой обхода для Как сделать вывод типа Scala достаточно мощным, чтобы обнаруживать параметр универсального типа?, который может не быть исправлен. В моем случае я не против получить TypeTag типа R или Option[R], все работает.


person tribbloid    schedule 18.06.2016    source источник


Ответы (1)


Это не улучшение, а как раз наоборот, и вывод типа Scala просто не поддерживает вывод Opt сначала и получение R оттуда: вместо этого он выводит Nothing, потому что R не является частью каких-либо типов параметров (и тип возвращаемого значения неизвестен). ).

Вы можете обойти это, явно указав параметры типа при каждом вызове: fromOptionFn2[String, Option[String]](...). Предоставление ожидаемого типа также должно работать в этом конкретном случае, я думаю: fromOptionFn2(...): Wrapper[String]. Однако лучше вообще не использовать сигнатуры параметров типа, такие как [R, Opt <: Option[R]].

person Alexey Romanov    schedule 18.06.2016
comment
Извините, я забыл аннотацию типа в своем вопросе (см. Мой обновленный фрагмент кода): возвращаемый тип fromOptionFn — Wrapper[R], который нельзя вывести из Opt во время компиляции. - person tribbloid; 19.06.2016