Usa
a = "foo"
b = "bar"
g x | x==a = a
| x==b = a
o
g "foo" = a
g "bar" = a
Quando si Pattern Match utilizzando una variabile come in
g a = ...
la variabile a
è una variabile locale, legato al argomento della funzione. Anche se a
è già stato definito globalmente, il codice sopra non utilizzerà il valore globale a
per eseguire un confronto.
Questa semantica consente di ragionare localmente sul codice. Considerate questo codice come un esempio:
f 2 x = 4
f c d = 0
Solo guardando la definizione di cui sopra si può vedere che è f 2 3
4
. Questo non viene modificato se in seguito si aggiunge una definizione per x
come segue:
x = 5
f 2 x = 4
f c d = 0
Se la semantica partita confrontato il secondo argomento di 5
, ora avremmo f 2 3
pari a 0
. Ciò renderebbe più difficile ragionare sulle definizioni delle funzioni, quindi molti (se non tutti) i linguaggi funzionali come Haskell usano variabili "locali" per la corrispondenza dei modelli, ignorando le possibili definizioni globali di tali variabili.
Un'alternativa più avventurosa è quella di utilizzare view patterns:
{-# LANGUAGE ViewPatterns #-}
a = "foo"
b = "bar"
g ((==a) -> True) = ...
g ((==b) -> True) = ...
io non sono un fan di questo approccio, però, dato che trovo i modelli standard con guardie di essere più chiaro.
g non è id perché: g b = a –