2014-05-20 18 views
5

Basta fissare con Haskell. Voglio definire alcuni elementi per creare facilmente morfismi tra di loro.Valori delle variabili per la corrispondenza dei modelli

a = "foo" 
b = "bar" 

g a = a --Problem is here 
g b = a --Problem is here 

Modifica Il problema è che tratta Haskell "a" in "g a" come una variabile, ma io in realtà voglio il valore della "a" sopra definito. Concettualmente una vogliono questo

g (valueOf a) = a --Problem is here 
g (valueOf b) = a --Problem is here 

Dove valueOf è una funzione magica che mi avrebbe dato

g "foo" = a 
g "bar" = a 
+0

g non è id perché: g b = a –

risposta

7

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 34. 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.

+0

Grazie! Vedo il punto. Ma pensa ancora che ci dovrebbe essere un operatore per dire all'interprete di usare la definizione nello scope esterno. –

+0

Protezioni come 'x | x == a = ... | x == b = ...'Non richiede molta digitazione. Altrimenti, potresti provare a sperimentare [view patterns] (http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#view-patterns), ma sembrano eccessivi per questo compito IMHO. – chi

3

Ci scusiamo se questo è un completo fraintendimento di cosa si vuole raggiungere, ma non farebbe qualcosa del genere?

Data Obj = A | B 

g A = A 
g B = A 

f A = "foo" 
f B = "bar" 

Si desidera un insieme predefinito di oggetti, sì?

Problemi correlati