[英]Scala Type Inference Not Working for GADTs in IntelliJ
以下代碼不會在 IntelliJ 中顯示為正在編譯。 它抱怨從eval
返回的類型應該是A
我希望它在使用過程中推斷出來。 該代碼使用sbt
可以正常編譯,但不能在 IntelliJ 上同時使用 Scala 版本 2 和 3 編譯(它運行正常,但在代碼中顯示錯誤消息)。 下面的代碼是否需要特殊配置(例如 sbt 參數、jvm 參數等)才能在 IntelliJ 上編譯顯示?
object Solution1 {
trait Expr[A]
case class B(bool: Boolean) extends Expr[Boolean]
case class I(i: Int) extends Expr[Int]
def eval[A](expr: Expr[A]): A = expr match {
case B(b) => b
case I(i) => i
}
}
眾所周知,廣義代數數據類型 (GADT) 在 Scala 中很難正確實現。 AFAIK scalac
和dotty
編譯器目前都有類型健全性漏洞,特別是使用協變 GADT 。
您的eval
應該返回T
類型的值,但由於i
的類型為Int
且b
的類型為Boolean
,因此編譯器似乎能夠看到,因為I
是Expr[Int]
的子類型,因此T
必須等於Int
然后T
必須以相同的方式等於Boolean
。
我很驚訝這種類型的檢查。 這很奇怪,因為人們會期望T
保持它的含義。 看來 Scala 2 的 GATDs 實現仍然有問題。
我並不驚訝 Intellij 的 Scala 插件將其標記為紅色。 您可以報告此問題,但我不確定他們是否可以對此采取任何措施,因為 Scala 暫時在這里存在缺陷。 它需要對他們進行特殊處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.