下面是我的意图的一个简单例子:
sealed trait Col[V] {
trait Wrapper
}
object Col1 extends Col[Int]
object Col2 extends Col[Double]
type WOf[T <: Col[_] with Singleton] = T#Wrapper
这是另一种(更简单和更普遍的)写作方式:
type WOf[T <: Col[_] with Singleton] = T match {
case Col1.type => Col1.Wrapper
case Col2.type => Col2.Wrapper
}
但是编译器不允许:
[Error]
***.scala:25:42: T is not a legal path
since it is not a concrete type
那么WOf
类型的正确写法是什么呢?
更新1:我可以推测Scala 3可以使用这个类型构造函数来表示一个如下定义的Eta扩展多态函数:
def wOf[T <: Col[_]](v: T): v.Wrapper = ???
我只是不知道它是什么,Scala 3有什么原因会选择让这种定义只适用于非常特定的情况吗?
1条答案
按热度按时间uemypmqf1#
由于这是一种新语言的特殊情况,我不希望找到示例,所以我最终要求BSP基于官方示例的变体生成它:
https://docs.scala-lang.org/scala3/reference/new-types/polymorphic-function-types.html
BSP生成的类型注解为:
不幸的是,此时它触发了一个编译器错误:
https://github.com/lampepfl/dotty/issues/16756
所以我们得等它修好了再用