簡體   English   中英

Scala:嵌套類型層次結構上的模式匹配

[英]Scala: pattern matching on nested type hierarchies

假設我有

sealed trait AlphaNumericChar

sealed trait AlphaChar
case object A extends AlphaNumericChar with AlphaChar
case object B extends AlphaNumericChar with AlphaChar

sealed trait NumericChar
case object One extends AlphaNumericChar with NumericChar
case object Two extends AlphaNumericChar with NumericChar

這種結構允許我在AlphaNumericChar上進行模式匹配並獲得所有A,B,One,Two和類似的模式匹配AlphaCharNumericChar並僅獲得相關對象。

它不允許我寫的是:

def foo(x: AlphaNumericChar) = ???
def bar(x: AlphaChar) = foo(x)

即,僅對某些類型的foo代理調用。 我當然可以改寫:

def baz(x: AlphaNumericChar with AlphaChar) = foo(x) 

這會起作用,但這可能有點難看。

另一種方法是讓AlphaCharNumericChar擴展AlphaNumericChar但這會弄亂我在AlphaNumericChar上的模式匹配,因為我現在必須處理_:AlphaChar_:NumericChar以及我不希望的案例對象。

有沒有辦法以某種方式擁有兩個世界中最好的? IE。

  • AlphaChar / NumericChar上的模式匹配條目的詳盡列表只有兩個元素。
  • AlphaNumericChar上的模式匹配條目的詳盡列表只有兩個元素。
  • 我可以在不使用baz語法的情況下讓上面的 function bar工作。

擴展 AlphaNumericChar 應該不是問題。 像這樣的東西很好用:

sealed trait AlphaNumericChar

sealed trait AlphaChar extends AlphaNumericChar

case object A extends AlphaChar
case object B extends AlphaChar

sealed trait NumericChar extends AlphaNumericChar

case object One extends NumericChar
case object Two extends NumericChar

def foo(x: AlphaNumericChar) = x match {
  case One => println("hi")
  case Two => println("bye")
  case A => println("foo")
  case B => println("bar")
}

def bar(x: AlphaChar) = foo(x)

def aThirdFunction(y: NumericChar) = y match {
  case One => println("eggs")
  case Two => println("beans")
}

foo(One)  // hi
foo(Two)  // bye
foo(A)    // foo
foo(B)    // bar
bar(A)    // foo
bar(B)    // bar
aThirdFunction(One) // eggs
aThirdFunction(Two) // beans

除非我誤解了你想要什么?

暫無
暫無

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

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