通用高等类型

时间:2018-09-28 16:02:17

标签: scala types existential-type higher-kinded-types

params

如何将通配符用于更高类型的类型?
无论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[_]] = ??? ^ 是什么,我只想要一个SeqToto

1 个答案:

答案 0 :(得分:2)

如果您可以将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])

感觉类似于this one

如果这种情况在您的代码中更经常发生,您还可以考虑通过将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])