计算字符串Haskell中字符的出现次数

时间:2016-03-16 20:36:04

标签: haskell

尝试确定如何计算char的出现次数为string。我将它存储在列表[char,count]中。

countChars :: String -> [(Char, Int)]

我是新手并且学习Haskell所以任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:3)

给你一个品味

> (map (head &&& length) . group . sort) "asdfasdfaeadf"
[('a',4),('d',3),('e',1),('f',3),('s',2)]

一堆或进口之后。

您可以轻松定义您的头部&&&长度,如果语法不熟悉。

> head_and_length x = (head x, length x)

组可以递归写入

group [] = []
group (x:xs) = (x:ys) : group zs
    where (ys,zs) = (takeWhile (==x) xs, dropWhile (==x) xs)

尽可能多地使用匹配元素,并递归地应用其余元素,直到什么都没有留下。请注意,此定义要求相同的元素是连续的,这就是为什么需要排序的原因。

编写一个复杂的函数是不推荐的,不过可以单独实现小功能(也许可以使用现有的功能),这些功能可以独立测试并创建这些功能的组合作为最终解决方案。 / p>

答案 1 :(得分:1)

这不会有所帮助,但它会很快。诀窍是使用OnFocusChangedListrner,一个非常有效的IntMap键映射表示,来存储每个角色的数量。我们正在使用字符作为密钥,因此我们首先创建一个Int类型,结束CharMap并编写一些包含其IntMap的函数等同物。

IntMap

这有点烦人,但相当机械。这是主要事件。我们将字符投入import Data.Foldable (Foldable, foldl') import Control.Applicative ((<|>)) import qualified Data.IntMap.Strict as IM import Data.IntMap (IntMap) -- Strict version of Data.Bifunctor.first first :: (a -> a') -> (a, b) -> (a', b) first f (a, b) = (f a, b) newtype CharMap a = CharMap (IntMap a) emptyCM :: CharMap a emptyCM = CharMap (IM.empty) toAssocAsc :: CharMap a -> [(Char, a)] toAssocAsc (CharMap m) = map (first toEnum) (IM.toAscList m) alter :: (Maybe a -> Maybe a) -> Char -> CharMap a -> CharMap a alter f c (CharMap m) = CharMap $ IM.alter f (fromEnum c) m ,将它们映射到它们的计数,然后在我们完成时将地图转换为关联列表。

CharMap