Я пытаюсь создать функцию, которая составляет список целых чисел, вы можете помочь?
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)
Надеюсь, это лучше
Мне нравится, что вы разместили свою версию, но, честно говоря, это неудобно, неэффективно и небезопасно. Избегайте использования !!
, head
или tail
, это приведет к сбою вашей программы при получении пустых списков или чего-то вне диапазона. Предпочитайте безопасные библиотечные функции от сопоставления с образцом, тогда компилятор может предупредить вас, если вы пропустили какой-то крайний случай.
Вместо кропотливого сравнения отдельных элементов используйте функцию, сравнивающую элементы до какого-то состояния.
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
Конечно, вы также можете сами определить версию охватывать, если хотите.
Разве тогда не будет список внутри кортежа? Я хочу, чтобы они были в списке?
@ErikHNguyen Откуда вы взяли, что это будет внутри кортежа? В приведенной выше функции groupUp
не возвращаются кортежи. Попробуйте сами. Функция span
использовалась как ступенька к функции groupUp
.
Привет, спасибо за помощь. Я просто не знаком с «случаем» «из» примера. Где я могу узнать об этом подробнее? Я сделал еще одну функцию, которая, вероятно, точно такая же, как у вас.
@ErikHNguyen case...of
объясняется в любом общем руководстве по Haskell. Это действительно помогает прочитать одну из стандартных книг ... LYAH, хоть и немного устарел, но все же моя рекомендация.
Пожалуйста, отформатируйте свой код.