2013-03-02 14 views
6

ho una variabile comeGruppo corrisponde nel caso in cui l'espressione

a = 3 

Per alcuni valori di a, ho la stessa funzione voglio chiamare:

case a of 
    3 -> print "hello" 
    4 -> print "hello" 
    5 -> print "hello" 
    6 -> print "hello something else" 

Così per un = 3, un = 4 e a = 5 faccio la stessa chiamata di funzione. Posso raggrupparli meglio? Sono un po 'alla ricerca di una soluzione che potrebbe essere:

case a of 
    3 || 4 || 5 -> print "hello" 
    6   -> print "hello something else" 

Questo non funziona, ovviamente, ma spero che arrivare dove voglio finire con.

Grazie.

+0

Sarebbe una bella funzione se Haskell consentisse ciò che suggerisci. – augustss

risposta

13

Come su

case a of 
    _ | a == 3 || a == 4 || a == 5 
     -> print "hello" 
    6 -> print "hello something else" 

meno noioso di scrivere sarebbe

case a of 
    _ | a `elem` [3, 4, 5] 
     -> print "hello" 
    6 -> print "hello something else" 

o

case a of 
    _ | 3 <= a && a <= 5 
     -> print "hello" 
    6 -> print "hello something else" 

o anche, se nel programma vero e c'erano un sacco di possibili valori per per confrontare, qualcosa del genere:

import qualified Data.Set as S 

valuesToMatchAgainst :: S.Set Int 
valuesToMatchAgainst = S.fromList [3, 4, 5] 

-- ... 

    case a of 
     _ | a `S.elem` valuesToMatchAgainst 
      -> print "hello" 
     6 -> print "hello something else" 

(sto presumendo si capisce già che _ è un jolly che corrisponde a qualsiasi valore, e che | introduces a guard.)

+0

Neat! Ho sempre visto solo guardie sul LHS di una definizione di funzione - non sapevo che potevi farlo in qualsiasi modello. –

2

si possono fare cose diverse per migliorare il vostro codice. In primo luogo, se tutti i rami chiamano la stessa funzione perché non:

print (case a of 
     3 -> "hello" 
     4 -> "hello" 
     5 -> "hello" 
     6 -> "hello something else") 

questi fattori di più del comportamento comune del codice. In secondo luogo, ti sembra di chiedere il raggruppamento dei casi 3,4 e 5 insieme, il modo migliore potrebbe essere quella di scomporre una funzione di categorizzazione:

let cat 3 = True 
    cat 4 = True 
    cat 5 = True 
    cat 6 = False 
in print (case cat a of True -> "hello" 
         False -> "hello something else") 

È possibile combinare questo con una delle alternative suggerite dal poster precedente (cat x = x elem [3,4,5] ecc.).

Problemi correlati