2011-06-03 1 views
2

Considérez ce qui suit:Comment puis-je utiliser les fonctions partielles pour composer mes instructions de correspondance?

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> 

Je pensais que je serais capable de faire alors ceci:

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

Mais non. Est-ce que je manque quelque chose de basique ici? Mon espoir était que mon PartialFunction pourrait être utilisé et réutilisé dans les déclarations de match. Est-ce que ce n'est pas possible?

+1

Votre 'pf' n'est pas une fonction partielle, c'est une fonction partielle levée (c'est-à-dire une fonction normale). Ce n'est pas pourquoi cela ne fonctionne pas, mais dans d'autres contextes cela peut faire la différence. –

+0

@Rex Ok, merci. Mais si ce n'est pas la raison pour laquelle ça ne fonctionne pas, savez-vous quelle est la raison? – pr1001

Répondre

5

Je pense que vous avez juste besoin de l'utiliser en fonction, par exemple .:

pf("$") 

Si vous définirez pf comme PartialFunction[String, Option[String]] vous pouvez également utiliser d'autres choses utiles comme pf.isDefinedAt("x").


Si vous regardez dans Scala Langue Spécification section 8.4 Pattern Matching Expressions, vous trouverez la syntaxe suivante:

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

Comme vous pouvez le voir, il est impossible de l'utiliser comme vous décrit, mais pf("$") agit de la même manière.

+0

Ahh, très intéressant. J'avais supposé que ce match ressemblait plus à un Scala normal qui prenait une «fonction partielle», mais ce n'est évidemment pas le cas. Par curiosité, pourriez-vous savoir ce que c'est? – pr1001

+0

@ pr1001: Je suis d'accord avec vous. Pour moi, il est également plus naturel de considérer 'match' comme une sorte d'extension de bibliothèque plutôt que comme une expression intégrée. Mais il semble que cette spécification a cette séparation entre la section mentionnée ** 8.4 ** et ** 8.5 Pattern Anonyme Fonctions **. Désolé, mais je ne connais pas les raisons pour cela (c'est peut-être juste des raisons historiques ... Je ne suis pas sûr) – tenshi

+0

C'était comme ça que ça fonctionnait à l'origine, mais ça a été changé à un moment donné. –

Questions connexes