2016-04-13 44 views
1

Rasgele bir ağaca sahibim ve onu bir tamsayı ağacına dönüştürmek istiyorum, orijinal değerler tamsayılarla değiştirilmelidir. Her durumda aynı değerin aynı numarayla değiştirilmesi gerekir.ağaçları etiketleme haskell

ağaç geçme için

işlevi sağlanmıştır ve bu ben etiketleri saklamak için bir yığın ihtiyaç inanmak benim etiketleme fonksiyonu

label :: Ord a => a -> State (Store a Int) Int 

olduğunu, ama onu nasıl uygulanacağını emin değilim, herhangi bir yönlendirme olur Geçişe işlevini Traversable typeclass tarafından verilen

traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) 

varsa o zaman,

+0

Yığın burada uygun değildir, ancak 'Mağaza' bir veri parçasının bir tamsayıya eşlenmesini sağlayan bir harita türüdür. – chepner

cevap

5

takdir ha f ~ State (Store a Int) ettik, bu yüzden

böylece
traverse label :: (Ord a, Traversable t) => t a -> State (Store a Int) (t Int) 

sadece o

labelTree :: (Tree t, Ord a) => t a -> Store a Int -> (t Int, Store a Int) 
labelTree tree labelStore = runState (traverse label tree) labelStore 

Ben olacağını tam olarak, böylece etiketli ağacı almak için o devlet eylemi, ardından ağaca traverse label uygulamak yürütmek gerekir ve bir argüman olarak labelStore sağlanmıştır, çünkü bu fonksiyonun bir takım varolan etiketlerle sağlanması istenebilir ve yeni bir Store'un nasıl oluşturulacağı açık değildir.

Ancak, özel bir şey ne olursa olsun listeleri, Map s, özel türleri için bu uygulamak veya böylece bile burada bir ağaç kullanma hakkında herhangi Traversable bir Traversable konteyner var sağlanan yeterli olacağını var olduğunu işaret edeceğiz Ord a => a değerlerini içerir.