This does not work properly:

Main> generate 5
[[1,1,1,1,1],[1,1,1,2],[1,1,2,1],[1,1,3],[1,2,1,1],[1,2,2],[1,3,1],[1,4],[2,1,1,1],[2,1,2],[2,2,1],[2,3],[3,1,1],[3,2],[4,1],[5]]

You need to add something else:

parts 0 = [[]]
parts n = [m:p | m<-[1..n], p<-parts (n-m), (null p || m<=head p)]

Main> parts 5
[[1,1,1,1,1],[1,1,1,2],[1,1,3],[1,2,2],[1,4],[2,3],[5]]

Best,

Salvador.

Doaitse Swierstra wrote:

Or (since we started to do someone's  homework anyway)

generate 0 = [[]]
generate n = [x:rest | x <- [1..n], rest <- generate (n-x)]


Doaitse Swierstra



On 2005 nov 25, at 10:29, Tomasz Zielonka wrote:

On Thu, Nov 24, 2005 at 05:52:23PM +0100, Jan van Eijck wrote:

Like so:

generatePs :: (Int,[Int]) -> [[Int]]
generatePs (n,[])       = [take n (repeat 1)]
generatePs (n,(x:xs))   =
(take n (repeat 1) ++ (x:xs)) : generatePs (pack (x-1) ((n +x),xs))
  where
  pack :: Int -> (Int,[Int]) ->(Int,[Int])
  pack 1 (m,xs) = (m,xs)
  pack k (m,xs) = if k > m  then pack (k-1) (m,xs)
                  else           pack k     (m-k,k:xs)

parts :: Int -> [[Int]]
parts n | n < 1     = error "part: argument <= 0"
        | n == 1    = [[1]]
        | otherwise = generatePs (0,[n])


How about a shorter version?

    part :: Integer -> [[Integer]]
    part = gen 1
      where
        gen m 0 = [[]]
        gen m n = [ x:xs | x <- [m..n], xs <- gen x (n - x) ]

Best regards
Tomasz

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell


_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell


_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to