[Haskell-cafe] Re: partitions of a multiset
Pekka Karjalainen
p3k at iki.fi
Tue Jul 24 15:41:01 EDT 2007
On 7/24/07, Brent Yorgey <byorgey at gmail.com> wrote:
> I'm not sure what a formal
> mathematical definition would be off the top of my head; but in Haskell,
> given a list L :: [a], I'm looking for all partitions P :: [[a]] where (sort
> . concat $ P) == (sort L).
Here is quick attempt that requires Ord [a] and expects a sorted list.
It may very well not be correct, but it seemed to get all the simple
cases I tried right. Can you find a counterexample where it doesn't
work?
import Data.List (nub, (\\))
subsets [] = [[]]
subsets xs = []:[ a:b | a <- nub xs,
let (_:tl) = dropWhile (/=a) xs, b <- subsets tl ]
multiPart [] = [[]]
multiPart xs = [ a:b | a <- takeWhile ((head xs ==) . head) $ tail $
subsets xs, b <- multiPart $ xs \\ a, null b || a <= head b ]
It would be nice if one could get rid of the (<=) and hence Ord
without allowing duplicates. Furthermore, I haven't worried at all
about space or time efficiency while writing this. I'd want to get it
right first.
Pekka
More information about the Haskell-Cafe
mailing list