【发布时间】:2016-08-23 15:09:16
【问题描述】:
我是 Haskell 的新手,正在尝试学习一些东西并完成交给我的任务。我想查找字符串中的字符数,但不导入 Haskell 模块。
我需要实现一个频率表,并且我想了解更多关于 Haskell 编程以及如何做到这一点的信息。 我将 FreqTable 作为一个元组,其中包含字符和字符串中“char”的出现次数。
type FreqTable = [(Char, Int)]
我一直在寻找解决方案几天和很长时间以找到一些工作示例。
我的函数或者task id中的函数声明如下:
fTable :: String -> FreqTable
我知道正确答案可以是:
map (\x -> (head x, length x)) $ group $ sort
或
map (head &&& length) . group . sort
或
[ (x,c) | x <- ['A'..'z'], let c = (length . filter (==x)), c>0 ]
我可以让它与我的列表完全一致,但我发现这是一个可选的解决方案。我遇到了一个错误,我现在可以通过上面的列表理解来解决。
Couldn't match expected type ‘String -> FreqTable’
with actual type ‘[(Char, [Char] -> Int)]’
In the expression:
[(x, c) |
x <- ['A' .. 'z'], let c = (length . filter (== x)), c > 0]
In an equation for ‘fTable’:
fTable
= [(x, c) |
x <- ['A' .. 'z'], let c = (length . filter (== x)), c > 0]
能否请人与我分享,并解释一个简单的方法来检查字符的频率,而无需导入 Data.List 或 Map
【问题讨论】:
-
c是String -> Int类型的函数,但您在要求它是Int(c>0) 类型的上下文中使用。好像忘记绑定变量了:\list -> [ (x,c) | ... c = length (filter (==x) list) ... ] -
“不导入任何东西”是什么意思?列表推导式使用列表单子,即函数 map、concat 和 guard(被语法糖隐藏)。这不是已经导入了吗?
-
你能把这个问题清理一下吗?我们不需要您的生活故事或您以后打算问什么问题。
-
@V.Semeria,这实际上并不是它们的实现方式,尽管它们可能是。我认为 OP 意味着 Prelude-only。
-
我的意思是没有 Data.List 或 Map 。即使他们在后台为排序和组工作,您也必须进行导入
标签: list haskell frequency huffman-code