[英]In Scala 3/Dotty, is it possible to write a kind/type constructor that takes a value with a unique path as an argument?
這是我的意圖的一個簡單示例:
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 擴展多態 function:
def wOf[T <: Col[_]](v: T): v.Wrapper = ???
我只是不知道它是什么,是否有任何理由 Scala 3 會選擇使這種定義僅適用於非常具體的情況?
由於這是一種新語言的小眾案例,我不希望找到示例。 所以我最終要求 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
所以我們必須等待它被修復才能在任何地方使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.