#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
.
Стилистически, обратите также внимание, что
something [x]
менее практично (и «эффективно», хотя здесь это не имеет особого значения), чемx : something
здесь, поскольку порядок не имеет значения,- функция as
f = x -> something
действительно должна быть записана какf x = something
, - и вам, вероятно, не следует использовать одно и то же имя переменной для ссылки на разные значения, это очень легко запутать.
Ваша функция cond легко переписывается с использованием частично применяемого ==
:
group [] = []
group (x:xs) = (x : takeWhile cond xs) : group (dropWhile cond xs)
where cond = (==) x
Это дает ожидаемый результат для group [1,1,1,2,4]
.
Комментарии:
1. Вы хотели сказать » менее практичный» вместо » более практичный»?