由lambda内部的长度引起的Foldable没有实例

iPi*_*o12 5 lambda haskell foldable

第一个问题在这里,完全是haskell上的菜鸟,所以请和我好心:)

我正在玩这个 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
Run Code Online (Sandbox Code Playgroud)

我想要突出显示的部分是函数'rpt',它计算字符在字符串中重复的次数,例如:"aaba" - > [3313](3来自字母a,它重复3次)​​"aaccva" - > [332213]

后来我尝试使用lambda和map创建函数,结果如下:

rpt chr list = map (\chr -> length $ filter (== chr)) list
Run Code Online (Sandbox Code Playgroud)

并且首先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
Run Code Online (Sandbox Code Playgroud)

在这里我被卡住了,我无法理解发生了什么......修复这个功能需要什么?

Ale*_*lec 5

您可能打算过滤掉list,因此为了使您的代码有效,您还需要添加list以下参数filter:

rpt chr list = map (\chr -> length $ filter (== chr) list) list
Run Code Online (Sandbox Code Playgroud)

作为初学者,我会忽略GHCi的建议FlexibleContexts.通常情况下,最终会产生您所拥有的错误消息(或其他令人困惑的东西No instance for (Num (Int -> Bool))).