簡體   English   中英

Scala 類型推斷不適用於 IntelliJ 中的 GADT

[英]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 scalacdotty編譯器目前都有類型健全性漏洞,特別是使用協變 GADT

您的eval應該返回T類型的值,但由於i的類型為Intb的類型為Boolean ,因此編譯器似乎能夠看到,因為IExpr[Int]的子類型,因此T必須等於Int然后T必須以相同的方式等於Boolean

我很驚訝這種類型的檢查。 這很奇怪,因為人們會期望T保持它的含義。 看來 Scala 2 的 GATDs 實現仍然有問題

我並不驚訝 Intellij 的 Scala 插件將其標記為紅色。 您可以報告此問題,但我不確定他們是否可以對此采取任何措施,因為 Scala 暫時在這里存在缺陷。 它需要對他們進行特殊處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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