Как исправить эту функцию haskell, используя take and drop while?

#haskell

#haskell

Вопрос:

Меня просят создать функцию haskell, которая будет выполнять следующее:

 group [1,1,2,3,3] = [[1,1],[2],[3,3]]

group [] = []
  

По сути, она группирует одинаковые последовательные термины

Я должен использовать take and drop while:

 group [] = []
group (x:xs) = (takeWhile cond xs    [x]) : group (dropWhile cond xs)
   where
    cond = (x -> x == head xs)
  

Вот что у меня есть.

Вышесказанное работает для случаев, когда один элемент находится в конце: group [1,1,2] == [[1,1],2] но не для случаев, когда он находится в середине: group [1,1,1,2,4] == [[1,1,1],[4,2]] (это должно быть [[1,1,1],[4],[2]]

В чем моя ошибка в функции?

Комментарии:

1. Названы две разные переменные x .

2. group [1,1,2] == [[1,1],2] Я знаю, что это не может быть правдой, даже не глядя на источник group , потому что RHS неверно типизирован.

Ответ №1:

Короткий ответ: Ваша ошибка заключается в использовании head в вашем состоянии. Вы хотите сравнить с x , а не head xs .

Стилистически, обратите также внимание, что

  1. something [x] менее практично (и «эффективно», хотя здесь это не имеет особого значения), чем x : something здесь, поскольку порядок не имеет значения,
  2. функция as f = x -> something действительно должна быть записана как f x = something ,
  3. и вам, вероятно, не следует использовать одно и то же имя переменной для ссылки на разные значения, это очень легко запутать.

Ваша функция cond легко переписывается с использованием частично применяемого == :

 group [] = []
group (x:xs) = (x : takeWhile cond xs) : group (dropWhile cond xs)
  where cond = (==) x
  

Это дает ожидаемый результат для group [1,1,1,2,4] .

Комментарии:

1. Вы хотели сказать » менее практичный» вместо » более практичный»?