2010-02-15 2 views
40

J'ai commencé à apprendre le scala il y a quelques jours et quand je l'ai appris, je le compare avec d'autres langages functional programming comme (Haskell, Erlang) avec lesquels j'avais une certaine familiarité. Est-ce que Scala a guard séquences disponibles?Est-ce que Scala a des gardes?

Je suis allé à travers la correspondance de modèle dans Scala, mais y a-t-il un concept équivalent à des gardes avec otherwise et tous?

Répondre

51

Oui, il utilise le mot-clé if. De la Case Classes section d'un Tour de Scala, près du fond:

def isIdentityFun(term: Term): Boolean = term match { 
    case Fun(x, Var(y)) if x == y => true 
    case _ => false 
} 

(Ce ne figure pas sur la page Pattern Matching, peut-être parce que le Tour est un aperçu rapide.)


Dans Haskell, otherwise est en fait juste une variable liée à True. Donc, cela n'ajoute aucun pouvoir au concept de correspondance de modèle. Vous pouvez l'obtenir simplement en répétant votre motif initial sans le protecteur:

// if this is your guarded match 
    case Fun(x, Var(y)) if x == y => true 
// and this is your 'otherwise' match 
    case Fun(x, Var(y)) if true => false 
// you could just write this: 
    case Fun(x, Var(y)) => false 
19

Oui, il existe des protections de motif. Ils sont utilisés comme ceci:

def boundedInt(min:Int, max: Int): Int => Int = { 
    case n if n>max => max 
    case n if n<min => min 
    case n => n 
} 

Notez qu'au lieu d'un otherwise -clause, vous spécifions simplement le modèle sans garde.

+0

Quel sera le «n» dans ce cas et s'il vous plaît donner un exemple de travail pour ce qui précède. – Jet

+1

@Jet 'n' sera l'argument donné à la fonction. [Ici] (http://ideone.com/HhSuF0) est un exemple d'utilisation de la fonction. – sepp2k

+0

J'ai compris, merci :-) – Jet

8

La réponse simple est non. Ce n'est pas exactement ce que vous recherchez (une correspondance exacte pour la syntaxe de Haskell). Vous utilisez la déclaration « match » de Scala avec un garde, et de fournir une carte sauvage, comme:

num match { 
    case 0 => "Zero" 
    case n if n > -1 =>"Positive number" 
    case _ => "Negative number" 
} 
3

Je suis tombé à ce poste chercher comment appliquer des gardes pour les matchs avec de multiples arguments, il est pas vraiment intuitive, J'ajoute un exemple aléatoire ici.

def func(x: Int, y: Int): String = (x, y) match { 
    case (_, 0) | (0, _) => "Zero" 
    case (x, _) if x > -1 => "Positive number" 
    case (_, y) if y < 0 => "Negative number" 
    case (_, _) => "Could not classify" 
} 

println(func(10,-1)) 
println(func(-10,1)) 
println(func(-10,0)) 
Questions connexes