gpt4 book ai didi

Scala:嵌套类型层次结构上的模式匹配

转载 作者:行者123 更新时间:2023-12-02 14:04:28 26 4
gpt4 key购买 nike

假设我有

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 以及在 AlphaChar 上进行类似的模式匹配,并且NumericChar 并仅获取相关对象。

它不允许我写:

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

即,仅针对某些类型代理调用foo。我当然可以这样写:

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

这会起作用,但可能有点难看。

替代方法是使 AlphaCharNumericChar 扩展 AlphaNumericChar 但这会扰乱我在 AlphaNumericChar 上的模式匹配因为除了我的 case 对象之外,我现在还必须处理 _:AlphaChar_:NumericChar ,这是不希望的。

有没有一种方法可以两全其美?即。

  • AlphaChar/NumericChar 上的模式匹配条目的详尽列表只有两个元素。
  • AlphaNumericChar 上的模式匹配条目的详尽列表只有两个元素。
  • 我可以让上面的 bar 函数正常工作,而无需借助 baz 语法。

最佳答案

扩展 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

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

关于Scala:嵌套类型层次结构上的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58998269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com