Родовые Высшие родовые типы - PullRequest
       66

Родовые Высшие родовые типы

0 голосов
/ 28 сентября 2018
class Toto[F[_]]()
val totos: Seq[Toto[_]] = Seq(new Toto[Future[_]], new Toto[IO[_]])
<console>:12: error: _$1 takes no type parameters, expected: one
       val totos: Seq[Toto[_]] = ???
                           ^

Как мы используем подстановочный знак для типов с более высоким родом?
Я просто хочу Seq или Toto независимо от того, что F.

1 Ответ

0 голосов
/ 28 сентября 2018

Если вы можете изменить Toto на ковариантность, может сработать следующее:

import language.higherKinds

class Toto[+F[_]]()

class Foo[X]
class Bar[X]

val toto: Toto[F] forSome { type F[X] } = new Toto[Foo]
val totos = Seq[Toto[F] forSome { type F[X] }](new Toto[Foo], new Toto[Bar])

Похоже на этот .

Если это произойдет большечасто в вашем коде вы также можете подумать о том, чтобы просто убрать F со своего пути, преобразовав его в член типа Toto:

import language.higherKinds

class Toto {
  type F[X]
}

object Toto {
  def empty[A[X]]: Toto = new Toto {
    type F[X] = A[X]
  }
}

class Foo[X]
class Bar[X]

val totos: Seq[Toto] = Seq(Toto.empty[Foo], Toto.empty[Bar])
...