Почему опция [Try[_]] не соответствует F[_]?

Итак, что-то вроде этого:

@ trait IntWrapper[F[_]] { def apply(i: Int): F[Int] }
defined trait IntWrapper

@ class OptWrapper extends IntWrapper[Option] { def apply(i: Int) = Option(i) }
defined class OptWrapper

Теперь я хочу сделать что-то вроде этого:

@ class TryOptWrapper extends IntWrapper[Try[Option]] { def apply(i: Int) = Try(Option(i)) }
cmd19.sc:1: scala.util.Try[Option] takes no type parameters, expected: one
class TryOptWrapper extends IntWrapper[Try[Option]] { def apply(i: Int) = Try(Option(i)) }
                                       ^
Compilation Failed

(То же самое, если я объявлю расширение признака как class TryOptWrapper extends IntWrapper[Try[Option[_]]])

Теперь, пожалуй, самое интересное, это работает:

@ type Topt[T] = Try[Option[T]]

@ class ToptWrapper extends IntWrapper[Topt] { def apply(i: Int) = Try(Option(i)) }
defined class ToptWrapper

Теперь, возможно ли сделать то же самое - т.е. реализовать свойство с параметром типа, являющимся вложенным параметризованным типом, - без необходимости явно объявлять псевдоним типа? Мне определенно кажется, что мне не хватает какого-то синтаксиса здесь.

1 ответ

Решение

Try ожидает тип параметра типа * а также Option имеет вид * => * так что ты не можешь писать Try[Option], только Try[Option[Int]], Try[Option[String]], Try[Option[_]]...

Попробуй типа лямбда

class TryOptWrapper extends IntWrapper[({ type λ[A] = Try[Option[A]] })#λ] { def apply(i: Int) = Try(Option(i)) }

Или с добрым проектором

class TryOptWrapper extends IntWrapper[Lambda[A => Try[Option[A]]]] { def apply(i: Int) = Try(Option(i)) }
Другие вопросы по тегам