Новичок Хаскелл | Список групп Ints - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать функцию, которая составляет список целых чисел, вы можете протянуть руку?

groupUp :: [Int] -> [[Int]]

пример:

groupUp [1,2,2,3,3,3] == [[1],[2,2],[3,3,3]]

Самое близкое, на что я мог прийти:

groupUp [] = [[]]
groupUp (x:[]) = []            
groupUp(x:y:xs)
 | x==y       = [x,y] : groupUp (xs)
 | otherwise  = [x] : groupUp (y:xs)

Но это ограничивает список группой максимум из 2 (пар) и не более. Что я должен изменить?

Редактировать: это работает, спасибо за помощь!

  groupUp xs= helper 0 xs
        where helper _ []=[] 
              helper i xs= takeWhile (==(xs!!i))xs: helper (i) (dropWhile (==(xs!!i))xs)

1 Ответ

0 голосов
/ 30 октября 2018

Вместо трудоемкого сравнения отдельных элементов используйте функцию, которая сравнивает элементы до некоторого условия .

Prelude> span (==2) [2,2,3,3,3,4,4,4,4]
([2,2],[3,3,3,4,4,4,4])

Затем выполните рекурсию, используя оставшуюся часть этого:

groupUp [] = [[]]   -- This should probably just be [], not [[]].
groupUp (x:xs) = case span (==x) xs of
     (thisGroup, others) -> (x:thisGroup) : groupUp others

Конечно, вы также можете сами определить версию span , если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...