这里的第一个问题,完全是关于haskell的菜鸟,所以请对我好点:)
我在玩this haskell练习的问题编号6
最终使用此代码解决了(或希望类似的东西)
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]
后来,我尝试使用lambda和map生成函数,结果是:
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
在这里我被困住了,我无法理解正在发生的事情...修复此功能需要什么?
最佳答案
您可能打算过滤list
,因此要使您的代码正常工作,还需要添加list
作为filter
的参数:
rpt chr list = map (\chr -> length $ filter (== chr) list) list
对于初学者,我建议忽略GHCi关于FlexibleContexts
的建议。它通常最终会产生错误消息,例如您所收到的错误消息(或其他令人困惑的消息,例如No instance for (Num (Int -> Bool))
)。关于haskell - 没有可折叠的实例因内部λ长度而产生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40642105/