Опираясь на то, на что Александр Прокофьев ответил:
repetitions x = concat (map tail (filter (\x -> (length x) > 1) (List.group (word (filter (\c -> (c >= 'a' && c <= 'z') || (c>='A' && c <= 'Z') || c==' ') x)))))
Удалить лишние скобки:
repetitions x = concat (map tail (filter (\x -> length x > 1) (List.group (word (filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x)))))
Используйте $ для удаления дополнительных скобок (каждый $ может заменить открывающую скобку, если конечная скобка находится в конце выражения):
repetitions x = concat $ map tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x
Заменить диапазоны символов функциями из Data.Char, объединить concat и map:
repetitions x = concatMap tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
Используйте раздел и карри в стиле без очков, чтобы упростить (\x -> length x > 1) to ((>1) . length)
. Это объединяет length
с (> 1) (частично примененный оператор или section ) в конвейере справа налево.
repetitions x = concatMap tail $ filter ((>1) . length) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
Исключить явную переменную "x", чтобы сделать общее выражение бесполезным:
repetitions = concatMap tail . filter ((>1) . length) . List.group . word . filter (\c -> isAlpha c || isSeparator c)
Теперь вся функция, читающая справа налево, представляет собой конвейер, который фильтрует только буквы или символы-разделители, разбивает их на слова, разбивает на группы, фильтрует эти группы с более чем 1 элементом, а затем сокращает оставшиеся группы. к первому элементу каждого.