Scala 如何使用PartialFunction编写匹配语句?

Scala 如何使用PartialFunction编写匹配语句?,scala,pattern-matching,partialfunction,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

考虑以下几点:

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.isDefinedAtx

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

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

因此,正如您所看到的,不可能像您所描述的那样使用它,但pf$的作用是相同的。

您的pf不是一个偏函数,它是一个提升的偏函数,即一个正则函数。这并不是为什么这不起作用,但在其他情况下,它可以起作用。@Rex好的,谢谢。但如果这不是它不起作用的原因,你知道原因是什么吗?啊,非常有趣。我曾认为匹配更像是一个普通的Scala东西,需要一个PartialFunction,但事实显然并非如此。出于好奇,你知道那是什么吗?@pr1001:我同意你的看法。对我来说,将match看作某种库扩展而不是内置表达式更自然。但是,规范似乎在第8.4节和第8.5节提到的模式匹配匿名函数之间有这种分离。对不起,我不知道原因,也许是历史原因。。。我不确定它最初是如何工作的,但它在某一点上被更改了。@pr1001:这很有趣,因为广义的try-catch-finally刚刚添加到Scala 2.9中。似乎它现在正是人们所期望的,这样你就可以给catch和其他块赋予部分功能。也许比赛最终也会改变: