我有一项任务是计算字符串中每个(小写)字符的出现次数。我不允许使用该库的任何功能,我提出了以下可行的解决方案。
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]
两个问题:
答案 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')