gpt4 book ai didi

scala - 模式匹配功能参数

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

我对scala中的这种模式匹配有疑问:

val div: (Double, Double) => Double = {
case (x, y) if y != 0 => x / y
}

我已经了解了模式匹配的工作方式以及它在scala中的语法,但是这种表达使我发疯。编译器如何知道x和y是函数的参数,并且模式匹配它们?

最佳答案

此规则在Scala语言规范的8.5 "Pattern Matching Anonymous Functions"部分中定义。如果使用具有模式匹配功能的匿名函数,则必须部分提供类型。您可以通过说类型是(Double, Double) => Double来实现,这是Function2[Double, Double, Double]的简写。

现在:

If the expected type is scala.Function k [S1,…,Sk, R], the expression is taken to be equivalent to the anonymous function:

(x1:S1,…,xk:Sk) => (x1,…,xk) match {  case p1 => b1 … case pn => bn}


因此,无论您的函数多么友好,模式匹配都会传递给函数参数的元组,因此您可以使用常规的元组提取器语法。

所以你的例子很短
val div: (Double, Double) => Double = (a, b) => (a, b) match {
case (x, y) if y != 0 => x / y
}

或者
val div = (a: Double, b: Double) => (a, b) match {
case (x, y) if y != 0 => x / y
}

提取程序参数 xy的命名取决于您的想象。您决定如何调用提取器的结果元素,也可以编写 case (foo, bar) => ...

关于scala - 模式匹配功能参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827715/

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