我只是写一些Scala代码: class Cat[T]
val x: Cat[_ <: String] = new Cat[String]
它可以被编译,但我不很好理解。 你可以看到我宣布的x类型为Cat[_ <: String],这意味着 Cat[ T forSome { type T <: String; }]
但是,我能做些什么与x当它有这种特殊类型的?是否有任何条件需要我这样申报
如果我有限制的类型有限DataKind {-# LANGUAGE DataKinds #-}
data K = A | B
data Ty (a :: K) = Ty { ... }
和忘记的类型K确切的无奈...但是记住它在传递一种存在类型字典。 class AK (t :: K) where k :: Ty t -> K
instance AK A where k _ = A
我需要为我正在处理的东西实现一个通用堆栈。这个堆栈应该能够保存不同类型的元素。例如(1,'c',True,“字符串”)。要支持的功能是top,pop和push。 元组是最自然的想法。 push x s = (x,s)
pop s = snd s
top s = (fst s, s)
但我也需要支持空栈。这里,pop和top没有在()上定义。 所以我尝试创建一个新类型。 data Stack
当我试图写一个可以接受任何Class[_]作为参数类: case class A(klass: Class[_])
我得到这个错误: test.scala:1: warning: inferred existential type Option[Class[_$1]] forSome { type $1 }, which cannot be expressed by wildcards, sh
我在解释器中使用类型无标签最终编码。不幸的是,我遇到了类型检查阶段的问题。最小测试用例如下: {-# LANGUAGE RankNTypes, ExistentialQuantification, NoMonomorphismRestriction #-}
class Program repr where
...
intro1 :: repr a (a,())
..