scala - 如何使用 PartialFunctions 来编写匹配语句?

标签 scala pattern-matching partialfunction

考虑以下因素:

scala> object Currency extends Enumeration {
     |   type Currency = Value
     |   val USD = Value
     |   val GBP = Value
     |   val EUR = Value
     |   val TRY = Value // Turkish lira
     |   val NGN = Value // Nigerian naira
     | }
defined module Currency

scala> import Currency._
import Currency._

scala> val pf: (String) => Option[Currency] = {
     |     case "$" => Some(USD)
     |     case "€" => Some(EUR)
     |     case "£" => Some(GBP)
     |     case "₦" => Some(NGN)
     |     case _ => None
     |   }
pf: (String) => Option[Currency.Currency] = <function1>

我想我可以做到这一点:

scala> "$" match pf
<console>:1: error: '{' expected but identifier found.
       "$" match pf
                 ^

但是没有。我在这里缺少一些基本的东西吗?我希望我的 PartialFunction 可以在 match 语句中使用和重用。这不可能吗?

最佳答案

我认为你只需要使用它作为一个函数,例如:

pf("$")

如果您将 pf 定义为 PartialFunction[String, Option[String]] 您还可以使用其他有用的东西,例如 pf.isDefinedAt("x")


如果您查看Scala 语言规范部分8.4 模式匹配表达式,您会发现以下语法:

Expr ::= PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’
CaseClauses ::= CaseClause {CaseClause}
CaseClause ::= ‘case’ Pattern [Guard] ‘=>’ Block

因此,如您所见,不可能按照您所描述的方式使用它,但 pf("$") 的行为方式相同。

关于scala - 如何使用 PartialFunctions 来编写匹配语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224729/

相关文章:

haskell - 使用 Haskell 进行无监督聚类

scala - 如何在 Scala 中部分应用带有类型参数的案例类

scala - 在 map 、平面 map 、...部分函数中使用元组

scala - 如何让 Spark slave 在 Hadoop+Spark 集群中使用 HDFS 输入文件 'local'?

scala - 为什么递归惰性列表会破坏 Scala 中的堆栈?

python - Python 中的通配符?

if-statement - `if let` 只是编写其他 `if` 语句的另一种方式吗?

scala - 在函数式编程术语中,您将 orElse 或其他回退方法称为什么?

scala - 如何让 SBT 仅重新运行失败的测试

scala - Akka Http - 主机级客户端 API Source.queue 模式