如何在Scala中定义存在的高级类型

如何在Scala中定义存在的高级类型,scala,functional-programming,type-systems,existential-type,higher-kinded-types,Scala,Functional Programming,Type Systems,Existential Type,Higher Kinded Types,我试图定义一个接受Scala中存在的更高级类型的类型 不幸的是,Scalac不允许这样做 Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45). Type in expressions to have them evaluated. Type :help for more information. scala> :paste // Entering paste mode (ct

我试图定义一个接受Scala中存在的更高级类型的类型

不幸的是,Scalac不允许这样做

Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :paste
// Entering paste mode (ctrl-D to finish)

trait H[F[_, _]]
trait T[A, B]
val h:H[T] = null
val e:H[F] forSome { type F[A, B] } = h

// Exiting paste mode, now interpreting.

<console>:13: error: type mismatch;
 found   : H[T]
 required: H[_[A, B] <: Any]
Note: T <: Any, but trait H is invariant in type F.
You may wish to define F as +F instead. (SLS 4.5)
       val e:H[F] forSome { type F[A, B] } = h
                                             ^

也许sschaef是对的,这是不可能的。我不知道以下内容是否对您有任何帮助:

type F[A,B] = X[A,B] forSome { type X[A,B] }  // alias

trait H[F[_, _]]
trait T[A, B]
val h: H[T] = null

val e: H[F] = h.asInstanceOf[H[F]]

我发现存在的高级类型可以用类型模式编写(并由此推断):


转换为任何似乎是必要的,但至少可以封装在函数中。

可以使用类型成员,而不是类型参数:

trait H {
  type F[_, _]
}

我想你做不到。看这里有一件奇怪的事情:使
H
F
trait H[+F[\uu,\u]]]
)中协变,然后突然以下编译很好:
val h2:H[Any]=null
。是的,这是
Any
,在那里,需要一个类型构造函数。如果有人知道这是否是故意的(如果是,这是什么意思),我想知道。@RégisJean Gilles我猜这也是scalac的错误,这也是我的赌注,但欢迎发表权威声明。@sschaef该限制似乎在Scala 2.11中被删除。
def toExistential[F[_, _]](h: H[F]) = h.asInstanceOf[Any] match {
  case x: H[_] => x
}

> val h = new H[T] {}
h: H[T] = $anon$1@4d0c3eac
> val f = toExistential(h)
f: H[_] = $anon$1@4d0c3eac
trait H {
  type F[_, _]
}