簡體   English   中英

Scala:類型推斷問題

[英]Scala: type inference issue

我有:

sealed trait Par[A]{def foo = ???}
case class Unit[A](v: () => A) extends Par[A]
case class Map2[L, R, A](parLeft: Par[L],
                         parRight: Par[R],
                         map: (L, R) => A) extends Par[A]

我的問題是,當我在p:Par[A]進行模式匹配以執行以下操作時:

def getSequentially: A = this match {
  case Par.Unit(f) => f()
  case Par.Map2(a, b, f) => f(a.getSequentially, b.getSequentially)
}    

LR在Intellij的類型檢查器中推斷為Any ,並且getSequentially調用以紅色突出顯示,警告: type mismatch, expected Nothing, actual Any ,因為f預期為: (Nothing, Nothing) => A 盡管它實際上可以運行和編譯。

我想我理解問題所在,並且應該能夠在Map2的定義中使用存在性類型解決問題。 唯一的問題是map參數具有依賴類型,因此我不知道該怎么做。 也許我應該改變AUX模式?

我的問題是,首先,為什么要編譯;其次,是否存在一種重組類型依賴關系的方法,以使其不再發出警告。

如果您想擁有存在,則可以使用類型化模式:

sealed trait Par[A]{
  def getSequentially: A = this match {
    case x: Par.Unit[A] => x.v()
    case x: Par.Map2[_, _, A] => x.map(x.parLeft.getSequentially, x.parRight.getSequentially)
  }
}

object Par {
  case class Unit[A](v: () => A) extends Par[A]
  case class Map2[L, R, A](parLeft: Par[L],
                           parRight: Par[R],
                           map: (L, R) => A) extends Par[A]
}

IntelliJ似乎沒有強調這一點。

暫無
暫無

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

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