Нет экземпляра для складного, вытекающего из длины внутри лямбды

Первый вопрос здесь и полностью нуб на haskell, так что будьте добры со мной:)

Я играл с вопросом № 6 из этого упражнения на Haskell

и в конце концов пришли к решению (или что-то подобное я надеюсь) с этим кодом

combinations gr lis = filter clean $ sequence $ replicate gr lis
where
    clean string
        | total > gr = False
        | otherwise = True
        where total = sum [ rpt c string | c <- string]
    rpt chr list = length $ filter (== chr) list

часть, которую мне нравится выделять, это функция 'rpt', которая подсчитывает количество повторений символа в строке, например: "aaba" -> [3313] (3 происходит от буквы a, которая повторяет 3 раза) "aaccva" -> [332213]

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

rpt chr list = map (\chr -> length $ filter (== chr)) list

и сначала ghci сказал мне использовать FlexibleContext, чтобы разрешить это, но если я это сделаю, то это даст:

<interactive>:7:1:
No instance for (Foldable ((->) [Char]))
  arising from a use of ‘rpt’
In the expression: rpt 'a' string
In an equation for ‘it’: it = rpt 'a' string

и вот я застрял, я не смог понять, что происходит... что нужно, чтобы исправить эту функцию?

1 ответ

Решение

Вы, вероятно, собираетесь фильтровать listТак что, чтобы ваш код работал, нужно также добавить list в качестве аргумента filter:

rpt chr list = map (\chr -> length $ filter (== chr) list) list

Как новичок, я бы проигнорировал предложение GHCi о FlexibleContexts, Это чаще всего приводит к появлению сообщений об ошибках, подобных тому, что у вас было (или другим сбивающим с толку вещам, таким как No instance for (Num (Int -> Bool))).

Другие вопросы по тегам