String 计算给定字符串Haskell中的Char实例数

String 计算给定字符串Haskell中的Char实例数,string,haskell,char,String,Haskell,Char,简单的问题 给定一个字符串,我希望能够输入一个字母,然后让我的函数计算该字母在字符串中出现的次数 countLetters :: String -> Char -> Int 如何做到这一点 countLetters :: String -> Char -> Int countLetters str c = length $ filter (== c) str 这只获取str中等于c的字符,然后计算其长度。这取决于您希望对一个字符串进行的调用次数。简单的解决方案是读取字

简单的问题

给定一个字符串,我希望能够输入一个字母,然后让我的函数计算该字母在字符串中出现的次数

countLetters :: String -> Char -> Int
如何做到这一点

countLetters :: String -> Char -> Int
countLetters str c = length $ filter (== c) str

这只获取
str
中等于
c
的字符,然后计算其长度。

这取决于您希望对一个
字符串进行的调用次数。简单的解决方案是读取字符串中的每个字符,如果它与您要查找的字符匹配,则增加计数器

现在,如果您使用计数器在某个对象上进行映射,显然可以使用
fold

countLetters xs x = foldl (\count char -> if char == x then (count + 1) else count) 0 xs

但是,如果您想要执行许多查询,则首先构建查找表(即排序)更有意义。然后您可以在
O(1)
中获得任意字符的重复次数(整个算法仍然是
O(n)
)。

排序后的操作不是更像O(m),其中m是重复字符的数量吗?假设您使用的是固定范围固定大小的表,则值的提取是
O(1)
。例如,考虑原始内存访问和指针算法。这会导致性能损失,即必须遍历整个输入字符串一次以进行筛选,然后遍历结果以获得长度。但是
length
filter
不都是惰性函数吗?我可以想象GHC可以优化这样一个简单的案例来生成一个循环。