2015-01-25 19 views
5

Appena iniziato in Haskell, sto cercando di capire il modo migliore per assegnare più variabili in base a una singola condizione. Finora ho appena fatto le valigie e disimballato Tuples. C'è un modo migliore/più idiomatico?Assegnazione di più variabili in Haskell

(var1, var2, var3) = 
    if foo > 0 
     then ("Foo", "Bar", 3) 
     else ("Bar", "Baz", 1) 

Inoltre, sono curioso del costo dell'imballaggio e del disimballaggio delle tuple. Se sto leggendo correttamente this, sembra che questo venga ottimizzato nelle funzioni, ma non è sicuro se questo è il caso di un incarico.

+1

È possibile utilizzare anche elenchi, solo per quello che sai. Si può anche modellarlo abbinandolo in più pezzi usando '(a: b: c: rest) = [1,2,3,4,5,6]' dove 'a = 1',' b = 2', 'c = 3', e 'rest = [4,5,6]'. Inoltre, questo è necessario solo nelle istruzioni 'let' e' where', non nel livello di espressione di base. – AJFarmar

+9

Dato che non abbiamo variabili _mutable_ in Haskell, chiamiamo queste "associazioni" o "definizioni" piuttosto che "assegnazioni". Il tuo codice sembra a posto, e non mi preoccuperei del costo a meno che punti di profilazione. Inoltre, se ti preoccupi di questa tupla, non vuoi sapere come '" Bar "' è effettivamente rappresentata in fase di esecuzione ... ;-) – chi

risposta

6

Sì, è perfetto. Se si compila con le ottimizzazioni attivate, le tuple saranno effettivamente "unboxed", quindi non comportano costi aggiuntivi. Il codice sarà trasformata in qualcosa di vagamente simile a questo:

(# var1, var2, var3 #) = 
    case foo > 0 of 
     False -> (# "Bar", "Baz", 1 #) 
     True -> (# "Foo", "Bar", 3 #) 

Un unboxed 3-tuple è in realtà solo tre valori-da non avere alcun tipo di struttura supplementare. Di conseguenza, non può essere memorizzato in una struttura dati, ma va bene. Naturalmente, se lo foo è noto al momento della compilazione, anche lo case verrà ottimizzato e otterrete solo tre definizioni.