2011-07-07 28 views
6

Bölüm 3 ikili ağaç temsil etmesi için şu özyinelemeli türünü tanımlar 1 değeri:Gerçek Dünya Haskell Bölüm 3 excercise: ile İkili Ağacı yapıcısı

egzersiz tek bir değer Oluşturucu kullanarak aynı tip uygulamak gerekir
data Tree a = Node a (Tree a) (Tree a) 
      | Empty 
       deriving (Show) 

, "Belki" türünü kullanarak alt düğümleri başvurmak için:

(sayfa 60 Bölüm 3 Alıştırma 2 itibaren) "bizim Java örnekte olduğu gibi, sadece tek bir yapıcı olan bir ağaç türü tanımlayın yerine Boş ait. kurucu, kullanmak için Belki türü refe Bir düğümün çocuklarına r "

data AltTree a = AltNode a (Maybe (AltTree a)) (Maybe (AltTree a)) 
       deriving (Show) 

Ancak bu gibi diğer boş ağaçları içeren bir ağaç için izin vermez:

ben ile geldi çözüm şudur

AltNode 1 (AltNode 2 Nothing Nothing) (AltNode 3 Nothing Nothing) 

Ve değilim emin neden, "Belki" "Belki" türü için bir değer yapıcı değil mi?

+0

Online'da gibi: [RWH> 3. Bölüm> Egzersizler] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

cevap

5

Bu hataya neden olan Nothing değer yapıcısı değil. Üst düzey ağacına geçiş yaptığınız iki dal size Maybe (AltTree a) türünde olmalıdır, ancak her ikisi de (AltNode 2 Nothing Nothing) ve (AltNode 3 Nothing Nothing) türünde AltTree Int tipine sahiptir. Onlardan Maybe türlerini oluşturmak için Just değer yapıcısını kullanmanız gerekir.

AltNode 1 (Just (AltNode 2 Nothing Nothing)) (Just (AltNode 3 Nothing Nothing)) 
+3

Ayrıca çözümdür @rr eksik - "Boş" için eş değeriniz yok. 'AltNode Hiçbir Şey Hiçbir şey' izin vermemelisin. Bu hala tam olarak doğru değil, çünkü şimdi tip sistemi çocuk sahibi boş düğümlere izin verebilir. Belki de tüm argümanları belki bir tuple çevirmek semantik olarak daha iyi olacak mı? –

+0

@Matajon, açıklama için teşekkürler, bu şimdi mantıklı. Ancak bu, kitapta verdikleri uygulamadan farklı bir şey yapmıyor mu? Ya da belki de bunu çok okuyorum. –

+0

@Thomas M. DuBuisson İyi bir nokta, Tamamen emin değilim, onunla oynamak zorundayım. Teşekkürler. –

İlgili konular