[英]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)
}
L
和R
在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.