2010-02-07 36 views
7

Temel olarak bir polimorfik ağaç veri türü oluşturdum ve belirli bir ağaçtaki öğe sayısını saymanın bir yoluna ihtiyacım var.Haskell'de bir ağaçtaki sayma öğeleri

data Tree a = Empty 
| Leaf a 
| Node (Tree a) a (Tree a) 
deriving (Eq, Ord, Show) 

Yani böyle Ints bir ağaca tanımlayabilirsiniz:

t :: Tree Int 
t = Node (Leaf 5) 7 (Node (Leaf 2) 3 (Leaf 7)) 

Ancak, bunlardan birinin öğe sayısını saymak için bir işlev gerekir İşte benim Ağaç veri türü için ilanıdır listeleri. Bu özyinelemeli fonksiyon tanımladık ama hata alıyorum "türetilmiş tip yeterince genel değil": Ne yapıyor olması gerektiğini burada bir şey

size :: Tree a -> Int 
size Empty = 0 
size (Leaf n) = 1 
size (Node x y z) = size x + size y + size z 

var mı?

cevap

12

Sana y no alt ağaçtır ama sadece eleman saklanan beri sadece

size (Node x y z) = size x + size z + 1 

olması gereken

size (Node x y z) = size x + size y + size z 

yazarken sadece bir yazım hatası olduğunu düşünüyorum.

Ya y olan boyutu hesaplanabilir bir ağaç yine eğer terim size y sadece mantıklı çünkü

size (Node left elem right) = size left + size right + 1 

Teknik olarak sizin hata oluşur bile net yapmak. Bu nedenle, bu maddenin türünün, Tree a -> Int, genel ile karşılaştırıldığında, Tree (Tree a) -> Int olduğu anlaşılacaktır.

+3

Boyut x + 1 + boyut z' değil miydi? Öğeleri saydığından ve her düğüm bir öğe içerir. – BaroqueBobcat

+0

@BaroqueBobcat: Argh ... Yep;) – Dario

+0

Aslında, "size" yazısının türü, sonsuz tip "Ağaç (Ağaç (Ağaç ...))) -> Int 'olacaktır. Bu gibi durumlarda, iyi bir numara her zaman kusurlu tip imzası bırakmak ve derleyicinin size doğru türün ne olduğunu düşündüğünü söylemesine izin vermektir. Bu durumda, GHC bana sonsuz bir tip oluşturmaya çalıştığını söylüyor ... – yatima2975

5

Son maddeye bak: Sol tarafa baktığımızda, Node x y z, y'un türü nedir? size y anlamlı mı?