Нет экземпляра для складного, вытекающего из длины внутри лямбды
Первый вопрос здесь и полностью нуб на 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))
).