在Scala 3/Dotty中,是否可以编写一个种类/类型构造函数,将具有唯一路径的值作为参数?

dxxyhpgq  于 2023-01-26  发布在  Scala
关注(0)|答案(1)|浏览(168)

下面是我的意图的一个简单例子:

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有什么原因会选择让这种定义只适用于非常特定的情况吗?

uemypmqf

uemypmqf1#

由于这是一种新语言的特殊情况,我不希望找到示例,所以我最终要求BSP基于官方示例的变体生成它:
https://docs.scala-lang.org/scala3/reference/new-types/polymorphic-function-types.html

class DependentPoly {

  sealed trait Col[V] {

    trait Wrapper
    val wrapper: Wrapper = ???
  }

  object Col1 extends Col[Int]

  object Col2 extends Col[Double]

  val polyFn = [C <: Col[?]] => (x: C) => x.wrapper
}

BSP生成的类型注解为:

[C <: Col[?]] => (x: C) => x.Wrapper

不幸的是,此时它触发了一个编译器错误:
https://github.com/lampepfl/dotty/issues/16756
所以我们得等它修好了再用

相关问题