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

时间:2016-11-16 20:54:41

标签: haskell lambda foldable

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

我正在玩this哈克尔练习的第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” - &gt; [3313](3来自字母a,重复3次) “aaccva” - &gt; [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

在这里我陷入了困境,我无法理解发生了什么......修复这个功能需要什么?

1 个答案:

答案 0 :(得分:5)

您可能打算过滤list,因此要使代码正常工作,您还需要添加list作为filter的参数:

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

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