簡體   English   中英

在 Scala 3/Dotty 中,是否可以編寫一個以具有唯一路徑的值作為參數的種類/類型構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM