计算字符串中字符的出现

时间:2019-05-10 18:32:12

标签: haskell

我有一项任务是计算字符串中每个(小写)字符的出现次数。我不允许使用该库的任何功能,我提出了以下可行的解决方案。

occur :: String -> [(Char,Int)]
occur y =  [ (x,count x y) | x<-['a'..'z'],  count x y > 0]

我刚开始尝试:

occur2 :: String -> [(Char,Int)]
occur2 y =  [ (x,z) | x<-['a'..'z'], z<- count x y,  count x y > 0]

我这样定义了辅助函数计数:

count :: Char -> String -> Int
count k str = length [n | n <- str, n == k]

两个问题:

  1. 为什么发生2不起作用?
  2. 没有我的辅助函数计数,是否有任何方法可以定义发生?

1 个答案:

答案 0 :(得分:3)

occur2不起作用,因为count x y不是列表,因此不能像z <- count x y中那样用于生成器表达式。而是使用let表达式。

您可以通过内联删除count定义。

occur :: String -> [(Char,Int)]
occur y = [ (x,z) | x <- ['a'..'z'], let z = length [n | n <- y, n == x], z > 0]

如果要使用库,则简单有效的实现方式是使用MultiSet

import qualified Data.MultiSet as MS

occur :: String -> [(Char,Int)]
occur = MS.toAscOccurList . MS.fromList . filter (\c -> c >= 'a' && c <= 'z')