【发布时间】:2020-07-17 08:26:25
【问题描述】:
问题:
trait UpperBound[O]
trait High[F[O] <: UpperBound[O]]
def canEqual(that :Any) = that.isInstanceOf[High[_]]
def high(h :High[_]) = ???
不编译,因为 scalac 看到的是 _ 类型,而不是它期望的类型构造函数。如何解决它,最好不要写小说?
原始问题(在编辑回复 Dmytro 的答案之前)有:
def canEqual(that :Any) = that.isInstanceOf[High[m forSome { type m[O] <: UpperBound[O] }]]
def high(h :High[m forSome { type m[O] <: UpperBound[O] }] = ???
有没有通过使用通配符表达式来编写上述两种方法的更短的方法?
简单地在High 的类型参数位置使用_ 是行不通的,因为类型不匹配,_[_] 甚至不是有效的类型表达式。
【问题讨论】:
-
关于你更新的问题,你的意思是
def high(h: High[F] forSome {type F[O] <: UpperBound[O] }) = ???吗? -
有趣。我从来不知道我在原始问题中写的内容与您在此处的 sn-p 之间存在差异。我需要更仔细地重新阅读 SLS,因为我根本看不到它来自哪里。
-
好吧,我想很明显
List[X[A]] forSome { type A }和List[X[A] forSome { type A }]是不同的。前者由具有X[A]类型的元素组成,其中A是任意的,但对于所有元素都是相同的。后者由具有X[A]类型的元素组成,其中A是任意的,并且对于不同的元素可以是不同的。 -
是的,既然你提到了它,那就很明显了。在我的辩护中,我在单个值的上下文中使用它,所以自然语言语义相同。
标签: scala types existential-type higher-kinded-types