我正在尝试计算字符串中的字符数以及递归函数,但它似乎没有用。
{- characterCounts s
PRE: True
POST: a table that maps each character that occurs in s to the number of
times the character occurs in s
EXAMPLES:
-}
characterCounts :: String -> Table Char Int
characterCounts [] = Table.empty
characterCounts s = characterCountsAux s Table.empty
characterCountsAux:: String -> Table Char Int -> Table Char Int
characterCountsAux [] table = table
characterCountsAux (x:xs) table = characterCountsAux xs (Table.insert (table) x (count x (x:xs) ))
count:: Char -> String -> Int
count c s = length $ filter (==c) s
如果我这样做:characterCounts "atraa"
我应该T [('a',3),('t',1),('r',1)]
,而是获得T [('a',1),('t',1),('r',1)]
。
建议将不胜感激。
答案 0 :(得分:1)
我似乎没有“表格”模块(在GHC中)。
您的代码看起来很奇怪:您似乎遍历所有字符,然后在计数时尝试再次循环(但仅限于列表的尾部)。
在另一条评论中链接的表格模块中有一个“计数”功能。
您应该做类似
的事情Table.insert table x ((count table x) + 1)
并删除“计数”功能。
添加:您还需要处理表中第一次出现的char。
答案 1 :(得分:1)
你的表看起来很像地图。因此,如果您可以使用Google地图,则可以尝试以下操作:
import qualified Data.Map as M
characterCounts :: [Char] -> M.Map Char Int
characterCounts = foldr ((flip $ M.insertWith (+)) 1) M.empty
现在,characterCounts "atraa"
会返回fromList [('a',3),('r',1),('t',1)]
,即Map Char Int
类似于您要求的Table Char Int
。如果需要,应该很容易实现转换。
答案 2 :(得分:1)
当你调用characterCountsAux xs _时,你给你的函数列表的其余部分。这意味着在第4次迭代中你正在调用
characterCountsAux "aa" T [('a',3),('t',1),('r',1)]
将表格更改为T [('a',2),('t',1),('r',1)]以及我们在下一次迭代中
characterCountsAux "a" T [('a',2),('t',1),('r',1)]
给你最后的T [('a',1),('t',1),('r',1)]。
一个天真的解决方案是从xs中删除所有出现的x,即
characterCountsAux (x:xs) table = characterCountsAux (filter (/= x) xs) (Table.insert (table) x (count x (x:xs) ))
当然看起来效率不高......