[Haskell-cafe] Huffman Codes in Haskell

Thomas Horstmeyer horstmey at Mathematik.Uni-Marburg.de
Fri Jun 25 12:03:03 EDT 2010


> How would you implement bfnum?  (If you've already read the paper,
> what was your first answer?)
> 
Actually, my first thought was "Just traverse the tree twice." Then it 
dawned on me, that the tree could be of infinite size and I settled for 
the following solution:

bfsn :: Tree a -> Tree Int
bfsn E = E
bfsn t = f [t] [] 0
   where
     f :: [Tree a] -> [Tree a] -> Int -> Tree Int
     f (T _ E E : xs) ys n = T n E E
     f (T _ t1 E : xs) ys n = T n (f (t1:children xs) (children ys) (n + 
length xs + length ys + 1)) E
     f (T _ E t2 : xs) ys n = T n E (f (t2:children xs) (children ys) (n 
+ length xs + length ys + 1))
     f (T _ t1 t2 : xs) ys n = T n t1' t2'
       where
         t1' = f (t1:t2:children xs) (children ys) m
         t2' = f (t2:children  xs) (children ys ++ children [t1]) (m+1)
         m = length xs + length ys + n + 1

children :: [Tree a] -> [Tree a]
children  [] = []
children (E:xs) = children xs
children (T _ E E:xs) = children xs
children (T _ E t2:xs) = t2:children xs
children (T _ t1 E:xs) = t1:children xs
children (T _ t1 t2:xs) = t1:t2:children xs

One could perhaps rewrite it into something more elegant (less cases for 
the f-function, write children as a map), but you wanted the first answer.
I am going to have a look at the paper now...

Thomas



More information about the Haskell-Cafe mailing list