2010-02-15 14 views
40

Ho iniziato a imparare scala pochi giorni fa e quando lo sto imparando, lo sto confrontando con altre lingue functional programming come (Haskell, Erlang) con cui avevo una certa dimestichezza. Scala ha sequenze guard disponibili?Scala ha guardie?

Ho verificato la corrispondenza di modelli in Scala, ma esiste un concetto equivalente alle protezioni con otherwise e tutto?

risposta

51

Sì, utilizza la parola chiave if. Dalla sezione Case Classes di un tour di Scala, vicino al fondo:

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

(Questo non è menzionato nella pagina Pattern Matching, forse perché il Tour è una rapida panoramica tale.)


In Haskell, otherwise è in realtà solo una variabile associata a True. Quindi non aggiunge alcun potere al concetto di abbinamento di modelli. Puoi ottenerlo semplicemente ripetendo il tuo schema iniziale senza la guardia:

// 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

Sì, ci sono protezioni modello. Sono utilizzati in questo modo:

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

noti che invece di un otherwise -clause, è sufficiente specifiy il modello, senza una guardia.

+0

Quale sarà il 'n' in questo caso e si prega di dare un esempio di lavoro per quanto sopra. – Jet

+1

@Jet 'n' sarà l'argomento assegnato alla funzione. [Here] (http://ideone.com/HhSuF0) è un esempio di utilizzo della funzione. – sepp2k

+0

Capito, grazie :-) – Jet

8

La semplice risposta è no. Non è esattamente quello che stai cercando (una corrispondenza esatta per la sintassi di Haskell). Si potrebbe utilizzare dichiarazione "match" di Scala con una guardia, e fornire una wild card, come:

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

mi sono imbattuto a questo post cercando come applicare guardie per le partite con più argomenti, in realtà non è intuitivo, in modo Sto aggiungendo un esempio casuale qui.

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)) 
Problemi correlati