Jon Fairbairn wrote:

Trees with all the elements of a list in that order:

the_trees [x] = [Leaf x]
the_trees l = zipWith Branch (concat (map the_trees (tail $ inits l)))
                            (concat (map the_trees (tail $ tails l)))

Sorry, but this problem seems to trigger incorrect codes, somehow.

Here we have the_trees [1,2,3,4] outputs

Branch (Leaf 1) (Branch (Leaf 2) (Branch (Leaf 3) (Leaf 4)))
Branch (Branch (Leaf 1) (Leaf 2))
       (Branch (Branch (Leaf 2) (Leaf 3)) (Leaf 4))
Branch (Branch (Leaf 1) (Branch (Leaf 2) (Leaf 3)))
       (Branch (Leaf 3) (Leaf 4))
Branch (Branch (Branch (Leaf 1) (Leaf 2)) (Leaf 3)) (Leaf 4)

which is certainly not as wanted. The problem is that you do the concat before the zip. We have for

splits xs = zip (tail . inits $ xs) (tail . tails $ xs)

splits [1,2,3,4] == ([1],[2,3,4]) : ([1,2],[3,4]) : ...

So now

length (the_trees [1]    ) == 1
length (the_trees [1,2]  ) == 1
length (the_trees [2,3,4]) == 2

So we build a Branch from the first tree with labels [1,2] and the last tree with labels [2,3,4]. That's wrong!

A fixed version could look like

the_trees [x] = [Leaf x]
the_trees xs  = nonempty_splits xs >>= \ (l,r) ->
                [ Branch a b | a <- the_trees l, b <- the_trees r ]

nonempty_splits (x:y:ys) = ([x],y:ys)
                         : [ (x:l,r) | (l,r) <- nonempty_splits (y:ys) ]
nonempty_splits _        = []

/BR

--
-- Mirko Rahn -- Tel +49-721 608 7504 --
--- http://liinwww.ira.uka.de/~rahn/ ---
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to