将唯一字符从字符串转换为Table Char Int

问题描述 投票:0回答:2

我正在尝试将字符串转换为它的唯一字符以及整数计数器到以下接口:

empty :: Table k v
insert :: Eq k => Table k v -> k -> v -> Table k v
exists :: Eq k => Table k v -> k -> Bool
lookup :: Eq k => Table k v -> k -> Maybe v
delete :: Eq k => Table k v -> k -> Table k v
iterate :: Table k v -> (b -> (k, v) -> b) -> b -> b
keys :: Table k v -> (b -> k -> b) -> b -> b
values :: Table k v -> (b -> v -> b) -> b -> b

到目前为止我的功能如下:

auxCharacterCounts :: String -> Table Char Int
auxCharacterCounts (x:xs)
| length (x:xs) > 1 = (Table.insert Table.empty x (length $ filter (\y -> y == x) (x:xs)))

例如,将字符串“sassa”传递给

auxCharacterCounts
,然后运行
lookup tablename 's'
将产生
Just 3

表明我们在字符串“sassa”中出现了 3 次 char 's'。我所困扰的是如何获取其他字符,可以说运行

lookup tablename 'a'
会产生结果
Just 2
(针对字符串“sassa”)

我不确定如何递归地运行这个,我可以以某种方式传递尾部吗?但如果我这样做,它会多次找到 char 's',并可能导致不必要的资源使用?

干杯。

string haskell char
2个回答
1
投票

编写辅助函数

increment :: (Eq k, Num v) => Table k v -> k -> Table k v

给表中的值加一。您可以使用您拥有的表函数来实现它。

然后扫描字符串,并为每个字符将表递增一次。


0
投票

当然,这里有一个更简单的解释:

数据结构更改:我从 Haskell 的 Data.Map.Strict 模块中从自定义 Table 类型切换到内置 Map 类型。 Map 使管理键值对变得更加容易。

功能变更:

insert:更新为使用 Map.insertWith 通过增加计数来处理现有键(字符)。 存在、查找、删除、迭代、键、值:这些函数现在使用 Map 函数来处理 Map 数据结构。 新函数:我添加了一个辅助函数 countChars,它递归地处理输入字符串,更新 Map 中的字符计数。

用法: auxCharacterCounts 函数现在初始化一个空 Map 并将其与输入字符串一起传递给 countChars。

这种方法简化了代码,并确保使用内置 Map 函数有效处理字符计数。

© www.soinside.com 2019 - 2024. All rights reserved.