gpt4 book ai didi

scala - 如何考虑模式匹配右侧枚举的所有情况

转载 作者:行者123 更新时间:2023-12-03 23:18:51 24 4
gpt4 key购买 nike

详尽的模式匹配很棒,但它似乎只适用于大小写 (=>) 运算符的左侧。

我很好奇是否有一种方法可以让人们验证函数(或表达式)的输出 是否可以绑定(bind)到该枚举。目标是让编译器在我忘记从枚举中输出一个项目时告诉我。

在我的示例中,我使用了以下包含三项的枚举:

object MyEnum { 
sealed trait t
case object E1 extends t
case object E2 extends t
case object E3 extends t
}

这里是一个会产生编译时警告的模式匹配表达式(我们已经知道):

def foo( e : MyEnum.t ) : Boolean =
e match {
case MyEnum.E1 => true
case MyEnum.E2 => false
case MyEnum.E3 => true // if we leave this line out, we get a warning
}

如果我们将 MyEnum.E3 留在模式匹配表达式之外,Scala 会提示,引用非穷举模式匹配。这非常有益,但我想知道反过来是否可行。

我们能否说明 => 右侧的所有 MyEnum.t 情况?

这是一个强调这一点的例子:

def bar( s : String ) : Option[MyEnum.t] = 
s match {
case "a" => Some(MyEnum.E1)
case "b" => Some(MyEnum.E2)
case "c" => Some(MyEnum.E3) // if we leave this out, no warning
case _ => None
}

在这个例子中,如果我们省略了带有 MyEnum.E3 的行,那么编译器就会继续进行,就好像没有任何错误一样。我想做出的断言是:

forall MyEnum.t (aliased as e) there exists Some(e) | None

我知道这可以很容易地通过运行时测试来覆盖,但我很好奇是否有办法静态检查它。

谢谢。

最佳答案

我要碰碰运气并声称这是不可能的(让我们对 Odersky 保密)。如果 Scala 编译器能够检测到这种情况,我认为它会比现在更慢 ;)

我能看到的唯一方法是像你所做的那样定义 foo,并通过迭代 foo 来定义 bar 来制作反向映射,但这对我来说意义不大,而且可能行不通在您的具体情况下。

我认为您的案例很好地说明了单元测试何时有用,那么为什么不写一个呢?

关于scala - 如何考虑模式匹配右侧枚举的所有情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694056/

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