Я пытаюсь абстрагироваться от некоторого библиотечного API, который может возвращать любой из типов A
, Option[A]
или Seq[A]
.
Пока у меня что-то вроде этого:
type Const[T] = T
sealed abstract class Request[F[_], A]
case class GetOne(id: Int) extends Request[Const, Int]
case class GetMany() extends Request[Seq, String]
А потом, когда я его использую:
def get[F[_], A](request: Request[F, A]): F[A] = request match {
case GetOne(id) => client.getOne[F[A]](id)
case GetMany() => client.getMany[A]() // error: Seq[A] does not conform to F[A]
}
Я понимаю, почему это не сработает, если F[_]
не является подклассом covariant
Seq[_]
или что-то в этом роде. Но я не знаю, как мне обойтись без использования Const[A]
. Я безнадежен? Пожалуйста помоги.
FetchRequest
, какова его сигнатура? - person isaias-b   schedule 24.10.2015Request
. - person Daniel Shin   schedule 24.10.2015client.getMany[A]()
возвращаетSeq[A]
и вызов вашей библиотеки, верно? - person isaias-b   schedule 24.10.2015get
получать какие-либоF[_]
заставляет меня задаться вопросом, что бы означал ваш вызов, если быF
былList
или чем-то менее очевидным, напримерFuture
. Я думаю, что в данном случае использование более высокого родственного типа слишком абстрактно. У функции не было бы шанса гарантировать, что заданы только допустимые типыF
, что приведет кMatchError
и прерыванию во время выполнения или, если доступно, предоставит допустимое значение по умолчанию в этом случае. Но я подозреваю, что это будет полезно по умолчанию;) - person isaias-b   schedule 24.10.2015