, чтобы дать вам вкус
> (map (head &&& length) . group . sort) "asdfasdfaeadf"
[('a',4),('d',3),('e',1),('f',3),('s',2)]
после сгустка или импорта.
Вы можете легко определить вашу голову & & & длина, если этот синтаксис незнакомец.
> head_and_length x = (head x, length x)
группа может быть записана рекурсивно
group [] = []
group (x:xs) = (x:ys) : group zs
where (ys,zs) = (takeWhile (==x) xs, dropWhile (==x) xs)
взять столько элементов, соответствующих как можно и рекурсивно применить на остальных элементах, пока ничего не осталось. Обратите внимание, что это определение требует, чтобы одни и те же элементы были смежными, поэтому требуется сортировка.
Написание комплексной функции не рекомендуется, но лучше реализовать небольшие функции отдельно (и, возможно, использовать существующие функции), которые могут быть независимо протестированы и создать их состав как окончательное решение.
Я думаю, вы должны решить это, используя [рекурсию] (http://learnyouahaskell.com/recursion)? – mb21
@ mb21 Я так предполагаю. Я только начал изучать haskell, и это бросает меня на такой цикл, потому что я использовал только объектно-ориентированные языки, а не функциональные. –
@ ZackHerbert, вы можете показать, что вы пробовали, и где вы застряли? – utdemir