[Haskell-beginners] Better Code

Saqib Shamsi shamsi.saqib at gmail.com
Fri Jan 13 16:05:54 UTC 2017


Hi,

The problem that I wish to solve is to divide a (sored) list of integers
into sublists such that each sublist contains numbers in consecutive
sequence.

For example,
*Input:* [1,2,3,7,8,10,11,12]
*Output:* [[1,2,3],[7,8],[10,11,12]]

I have written the following code and it does the trick.

-- Take a list and divide it at first point of non-consecutive number
encounter
divide :: [Int] -> [Int] -> ([Int], [Int])
divide first [] = (first, [])
divide first second = if (last first) /= firstSecond - 1 then (first,
second)
                      else divide (first ++ [firstSecond]) (tail second)
                      where firstSecond = head second


-- Helper for breaking a list of numbers into consecutive sublists
breakIntoConsecsHelper :: [Int] -> [[Int]] -> [[Int]]
breakIntoConsecsHelper [] [[]] = [[]]
breakIntoConsecsHelper lst ans = if two == [] then ans ++ [one]
                                 else ans ++ [one] ++
breakIntoConsecsHelper two []
                                 where
                                      firstElem = head lst
                                      remaining = tail lst
                                      (one, two) = divide [firstElem]
remaining


-- Break the list into sublists of consective numbers
breakIntoConsecs :: [Int] -> [[Int]]
breakIntoConsecs lst = breakIntoConsecsHelper lst [[]]

-- Take the tail of the result given by the function above to get the
required list of lists.

However, I was wondering if there was a better way of doing this. Any help
would be highly appreciated.

Thank you.
Best Regards,
Saqib Shamsi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20170113/3f37c4a5/attachment.html>


More information about the Beginners mailing list