由于 lambda 内部的长度,没有 Foldable 的实例
No instance for Foldable arising from length inside lambda
这里的第一个问题完全是 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 和映射创建函数,结果如下:
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 的菜鸟,所以请多多关照 :)
我在玩 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 和映射创建函数,结果如下:
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))
)。