[Haskell-beginners] partition a list in all possible ways

Daniel Fischer daniel.is.fischer at googlemail.com
Tue Apr 26 20:50:03 CEST 2011


On Tuesday 26 April 2011 20:10:37, I. J. Kennedy wrote:
> I'm looking for a function  [a] -> [[[a]]]  that will partition a list
> into non-empty pieces in all possible ways.
> For example
> f [1,2,3,4] =  [[[1],[2],[3],[4]], [[1],[2],[3,4]], [[1],[2,3],[4]],
> [[1],[2,3,4]], [[1,2],[3],[4]], [[1,2],[3,4]], [[1,2,3],[4]],
> [[1,2,3,4]]]

Your description doesn't quite match your example, [[1,3],[2],[4]] is a 
partition of [1,2,3,4] into non-empty pieces which doesn't appear in your 
result.
By your example, you want all possible partitions into non-empty contiguous 
subsequences, which is somewhat easier (not that all partitions are really 
difficult).

> Perhaps this is a well-known function to experts, but not
> to me. Hoogle doesn't seem to have anything with this signature.
> Thanks,
> Jack

Think recursively. For (x:xs), you get two classes of partitions,
a) those where x makes up a part of its own, those are

[[x]:parts | parts <- partitions xs]

or map ([x] :) (partitions xs)

b) those where x belongs to the same part as its successor in the original 
list, those are obtained by sticking x to the front of each first part of 
the partitions of xs,

[(x:ys):yss | (ys:yss) <- partitions xs]

For an empty list, you get exactly one partition into non-empty pieces, the 
empty partition, [ [] ], so

partitions [] = [[]]
partitions (x:xs) = [[x]:p | p <- partitions xs]
                 ++ [(x:ys):yss | (ys:yss) <- partitions xs]



More information about the Beginners mailing list