2015-01-25 13 views
5

Beginnen Sie einfach in Haskell, und ich versuche herauszufinden, wie Sie mehrere Variablen auf der Grundlage einer einzigen Bedingung am besten zuweisen können. Bis jetzt habe ich nur Tuples gepackt und ausgepackt. Gibt es einen besseren/mehr idiomatischen Weg?Mehrere Variablen in Haskell zuweisen

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

Auch neugierig auf die Kosten für das Packen und Auspacken der Tupel. Wenn ich this richtig lese, scheint es, dass dies in Funktionen wegoptimiert wird, aber nicht sicher, ob das bei einer Zuweisung der Fall ist.

+1

Sie könnten auch Listen verwenden, nur damit Sie es wissen. Sie könnten sogar Muster in größeren Chunks mit '(a: b: c: rest) = [1,2,3,4,5,6]' mit 'a = 1',' b = 2', 'c kombinieren = 3' und 'rest = [4,5,6]'. Außerdem ist dies nur in 'let'- und' where'-Anweisungen notwendig, nicht in der Basisausdrucksebene. – AJFarmar

+9

Da wir in Haskell keine _mutable_ Variablen haben, nennen wir diese "Bindungen" oder "Definitionen" und nicht "Zuweisungen". Ihr Code sieht gut aus und ich mache mir keine Gedanken über die Kosten, es sei denn, das Profil zeigt darauf. Wenn Sie sich um dieses Tupel kümmern, wollen Sie nicht wissen, wie "Bar" 'zur Laufzeit dargestellt wird ... ;-) – chi

Antwort

6

Ja, das ist völlig in Ordnung. Wenn Sie mit optimierten Kompilierungen kompilieren, werden die Tupel tatsächlich "ungeboxt", so dass sie keine zusätzlichen Kosten verursachen. Der Code wird vage wie diese zu etwas verwandelt werden:

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

Eine unboxed 3-Tupel ist eigentlich nur drei Werte-es hat keine Art von zusätzlicher Struktur. Daher kann es nicht in einer Datenstruktur gespeichert werden, aber das ist in Ordnung. Natürlich, wenn foo zur Kompilierzeit bekannt ist, wird die case auch weg optimiert, und Sie werden nur drei Definitionen erhalten.

Verwandte Themen