【问题标题】:How can I use PartialFunctions to compose my match statements?如何使用 PartialFunctions 来编写匹配语句?
【发布时间】:2011-09-07 15:48:46
【问题描述】:

考虑以下几点:

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 可以在匹配语句中使用和重用。这不可能吗?

【问题讨论】:

  • 您的 pf 不是偏函数,而是提升的偏函数(即常规函数)。这不是为什么这不起作用,但在其他情况下它可以产生影响。
  • @Rex 好的,谢谢。但如果不是为什么不工作,你知道是什么原因吗?

标签: scala pattern-matching partialfunction


【解决方案1】:

我认为您只需将其用作函数,例如:

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 事情,它需要一个PartialFunction,但显然情况并非如此。出于好奇,你会碰巧知道那是什么吗?
  • @pr1001:我同意你的看法。对我来说,将match 视为某种库扩展而不是内置表达式也更自然。但似乎规范在提到的 8.4 部分和 8.5 模式匹配匿名函数 之间有这种区别。抱歉,我不知道这是什么原因(也许只是历史原因……我不确定)
  • 最初是这样工作的,但有一点改变了。
  • @pr1001:这很有趣,因为泛化的try-catch-finally 刚刚添加到 Scala 2.9 中。似乎它现在正是人们所期望的(这样您就可以为 catch 和其他块提供部分功能)。也许match 最终也会被改变:)
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2020-12-05
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多