[Haskell-cafe] Huffman Codes in Haskell

Tillmann Rendel rendel at Mathematik.Uni-Marburg.de
Sat Jun 26 14:11:14 EDT 2010


John Lato wrote:
> How would you implement bfnum?  (If you've already read the paper,
> what was your first answer?)

My first idea was something similar to what is described in appendix A. 
However, after reading the paper, I wrote the following code:

   data Tree a = E | T a (Tree a) (Tree a)
     deriving Show

   bfnum :: Tree a -> Tree Int
   bfnum = num . bf

   bf :: Tree a -> [Tree a]
   bf root = output where
     children = go 1 output
     output = root : children

     go 0 _ = []
     go n (E       : rest) = go (pred n) rest
     go n (T _ a b : rest) = a : b : go (succ n) rest

   num :: [Tree a] -> Tree Int
   num input = root where
     root : children = go 1 input children

     go k (E : input) children = E : go k input children
     go k (T _ _ _ : input) ~(a : ~(b : children))
       = T k a b : go (succ k) input children

Maybe one could try to fuse bf and num.

   Tillmann


More information about the Haskell-Cafe mailing list