Scala 中是否有类型变量 'm forSome { type m[O] <: UpperBound[O] }` 的简写?

2023-12-09

Problem:

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] }] = ???

是否有使用通配符表达式来编写上述两种方法的更短方法? 只需使用_ in High的类型参数位置不起作用,因为类型不匹配,并且_[_]甚至不是有效的类型表达式。


  • 如果你在外面进行存在量化High那么就只是

    type T = High[F] forSome { type F[O] <: UpperBound[O] }
    
    def canEqual(that: Any) = that.isInstanceOf[T]
    
    def high(h: T) = ???
    
  • 如果你在里面进行存在量化High然后自从

    implicitly[(n forSome { type n <: Upper}) =:= Upper]
    implicitly[(m[O1] forSome { type m[O] <: UpperBound[O]}) =:= UpperBound[O1]]
    

    (反之亦然)这只是High[UpperBound]

    implicitly[High[m forSome { type m[O] <: UpperBound[O] }] =:= High[UpperBound]]
    
    def canEqual(that: Any) = that.isInstanceOf[High[UpperBound]]
    
    def high(h: High[UpperBound]) = ???
    

    存在主义类型???? forSome { ???? } where ????包含子句类型????[tps]>:????<:????相当于类型????′ forSome { ???? } where ????′由于。。。导致的结果????通过替换每个协变出现???? in ???? by ????并通过替换每个逆变出现???? in ???? by ????.

    https://scala-lang.org/files/archive/spec/2.13/03-types.html#simplification-rules

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中是否有类型变量 'm forSome { type m[O] <: UpperBound[O] }` 的简写? 的相关文章

随机推荐