2011-01-22 11 views
5

Yani, birden çok tanım (işlev) içeren bir işlev var ve eşleştiğine bağlı olarak, (a, b) veya (a, b)], ancak derleyici hataları atıyor çünkü onlar farklı tipler. Bunu çözmek için her ikisini de kullanmaya çalışıyordum, ama muhtemelen doğru kullanmadı: P. herhangi bir yardım?Farklı türlerde dönmek için bir işlev nasıl kullanılır

+1

Bunu doğrudan yapamazsınız çünkü işlevlerin geri dönüş tipi derleme zamanında bilinmelidir, korumalar çalışma zamanında eşleştirilir. Ama gerçekten farklı bir tür döndürmek istediğinize emin misiniz? İki vakayı ayırt etmek için sonuçta desen eşlemeyi düşünüyorsanız, Ya iyi. Ya da belki ilk durumda tek bir liste yapacak? Ne yapacağın hakkında daha fazla bilgi verebilir misin? – b0fh

+0

http://paste.pocoo.org/show/325066/ şu ana kadar –

+0

işlevimdir ve bu bir büyü büyüsü okumak gibidir. Bunun anlamı ne? – luqui

cevap

9

Either sadece: Burada kullanarak ancak nasıl yanlış gittiğini emin değilim

basit onun kullanım örneğidir Bunu yapmanın yolu. içinde, Ancak

foo n = case stuff n of 
      Left (a,b) -> ... 
      Right pairs -> ... 

, sorun hakkında hiçbir şey bilmeden: Biri bu fonksiyonu çağırdığında

stuff :: Int -> Either (Int,Int) [(Int,Int)] 
stuff 0 = Left (0, 0) 
stuff n = Right [ (x,x) | x <- [0..n] ] 

Sonra onlar desen maç öğrenmek için iki türde de döndürdü: Burada aptal örnek Genel Fonksiyonunuzun anlamı hakkında biraz daha düşünmeyi öneririm. Ne alıyor, ne geri geliyor? Kesin, matematiksel ol. Cevabınız ne kadar basit olursa, bu işlev sizin programınızın geri kalanı ve Haskell konseptleri ile daha sorunsuz çalışır. Benim için, bu açıklamalarda Either nadiren ortaya çıkıyor. İki sonucu nasıl birleştirebilirsin? Belki de işleviniz için anlamlıysa, Left (a,b) yerine [(a,b)] tekil listeyi döndürürsünüz.

Haskell, Python veya jQuery'den kullanabileceğiniz türden çok akıllı olmaya çalışan işlevlerle iyi çalışmıyor. Aptal ve hassas tutun - bu basit parçalardan oluşan 'dan karmaşıklığınızı alın. Bunu merak ediyorsanız, sorununuz hakkında daha fazla ayrıntı, neyi başarmaya çalıştığınız ve neden bu şekilde çalışmasını istediğinizle ilgili başka bir soru sorun. Vaaz verdiğim için özür dilerim

+0

Bu tür sistemin istediğimiz özelliğin * koruma * olduğunu da ekleyeyim: "stuff :: Int -> (Int, Int)" '' şeyler 7'ye bir çağrı demek diyelim ki [[x, x] | x <- [0..n] 'türünde [[(Int, Int)] türüne sahip olan örnekte. Bu, "stuff" ibaresinin geri dönüş türünden farklıdır ve dolayısıyla tür korunmaz.Herhangi bir şey için sisteme güvenirsek, bu tutarsızlık kararlaştırılmalıdır. Bu nedenle, tip denetleyicisi programımızı yanlış yazılmış olarak reddeder. –

0

Haskell'deki işlevler yalnızca bir tür döndürür, bu nedenle işleviniz türünüzü döndüreceği için her ikisi de işe yarayacaktır (a, b) [(a.b)]. veya ona özel bir veri türü eşdeğer - -

test a b = 
    if a == True 
    then Left (a,b) 
    else Right [(a,b)] 
+0

şimdi fonksiyonum şu: http://paste.pocoo.org/show/325090/ İşte hata: http: //paste.pocoo. org/show/325093/ –

+0

@Chris 'Right lgst i 'Right (lgst i)' olmalıdır. – dave4420

+0

Tamam, http://paste.pocoo.org/show/325143/ çalışır, ancak ikinci iki gardiyanın bana http: //paste.pocoo.org/show/325144/ gibi bir şeye bakması gerekir: http://paste.pocoo.org/show/325145/ –

İlgili konular