Хорошо, хорошее начало.Одна непосредственная проблема заключается в том, что спецификация требует, чтобы функция работала со списками чисел, но вы определяете ее для строк.Список должен быть отсортирован, поэтому его элементы должны иметь класс типов Ord
.Поэтому давайте исправим сигнатуру типа:
repeated :: Ord a => [a] -> [a]
После вызова sort
и group
у вас будет список списков [[a]]
.Давайте рассмотрим вашу идею использования filter
.Это работает.Ваш предикат должен, как вы сказали, проверить length
каждого списка в списке, а затем сравнить, что length
с 1.
Фильтрация списка списков дает вам подмножество, которое является другим спискомсписки типа [[a]]
.Вам нужно сгладить этот список.То, что вы хотите сделать, это map
каждая запись в списке списков для одного из ее элементов.Например, первый.В Prelude
есть функция для этого.
Итак, вы можете заполнить следующий скелет:
module Repeated (repeated) where
import Data.List (group, sort)
repeated :: Ord a => [a] -> [a]
repeated = map _
. filter (\x -> _)
. group
. sort
Я написал это в стиле без точек с помощью фильтрацииПредикат как лямбда-выражение, но многие другие способы написать это одинаково хороши.Найдите тот, который вам нравится!(Например, вы также можете написать предикат filter
в стиле без точек, как композицию из двух функций: сравнение с результатом length
.)
Когда вы попытаетесь скомпилировать это,компилятор скажет вам, что есть два типизированных отверстия , _
записей справа от знаков равенства.Он также скажет вам тип отверстий.Первая дыра нуждается в функции, которая берет список и возвращает вам единственный элемент.Для второго отверстия требуется логическое выражение, использующее x
.Заполните их правильно, и ваша программа будет работать.