2015-01-25 26 views
5

Sadece Haskell'e başladım ve tek bir koşula bağlı olarak birden çok değişken atamanın en iyi yolunu bulmaya çalışıyorum. Şimdiye kadar sadece Tuples'ı paketleyip paketliyorum. Daha iyi/daha deyimsel bir yolu var mı?Haskell'de birden fazla değişken atama

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

Ayrıca Tuple'ların paketlenmesi ve paketlerinin açılması maliyetini de merak ediyoruz. this'u doğru okuyorsam, bu işlevler arasında en iyi duruma getirilmiş gibi görünüyor, ancak bir ödevle durumun bu olduğundan emin değil.

+1

Listeler de kullanabilirsiniz, sadece bildiğiniz gibi. Kalıbın daha büyük parçalarla eşleştirilebilmesi için '' (a: b: c: dinlenme) = [1,2,3,4,5,6] '' a = 1', 'b = 2'', = 3 've 'dinlenme = [4,5,6]'. Dahası, bu sadece temel ifadede değil, '' '' '' 'ifadelerinde gereklidir. – AJFarmar

+9

Haskell'de _mutable_ değişkenlerine sahip olmadığımız için, bu "bağlamalar" veya "tanımlar" yerine "tanımlamalar" diyoruz. Kodunuz iyi görünüyor ve profil oluşturulmadığı sürece maliyet hakkında endişelenmem. Ayrıca, bu tuple ilgili endişeleriniz varsa, "Bar" ın aslında çalışma zamanında nasıl temsil edildiğini bilmek istemezsiniz ... ;-) – chi

cevap

6

Evet, bu kesinlikle iyi. Optimizasyonları etkin bir şekilde derlerseniz, tuple'lar gerçekten de "kutudan çıkarılmış" olacaklar, bu nedenle ekstra maliyete sahip olmayacaklar. Kod belli belirsiz böyle bir şeye dönüşecek:

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

bir kutulanmamış 3-lü aslında sadece üç değer-ekstra yapının her türlü bulunmamaktadır. Sonuç olarak, bir veri yapısında saklanamaz, ancak sorun değil. Elbette, foo derleme zamanında biliniyorsa, case da en iyi duruma getirilecek ve sadece üç tanım alacaktır.