在Haskell中累积元组列表中的值计数

Evg*_*eny 3 iteration haskell list count

我正在尝试使用指示值类型(年度和季度)的模式字符串来解析列表.我需要在结果输出中累积四分之一数字.到目前为止,我想出了这个:

row = [100, 10, 40, 25, 25]
fmt = "aqqqq"
expected = [('a',1,100),('q',1,10),('q',2,40),('q',3,25),('q',4,25)]

count :: Char -> String -> Int
count letter str = length $ filter (== letter) str

split :: String -> [a] -> [(Char, Int, a)]
split fmt row = [(freq, count freq (fmt' i), x)   
               | (freq, x, i) <- zip3 fmt row [0..]]
               where fmt' i = take (i+1) fmt

-- split "aqqqq" [100, 10, 40, 25, 25]
-- [('a',1,100),('q',1,10),('q',2,40),('q',3,25),('q',4,25)]
Run Code Online (Sandbox Code Playgroud)

我想这个代码应该有一些更具可读性和高性能的东西,甚至是一个非常棒的衬里.

我还尝试扩展"aqqqq"到元组列表,[('a',1),('q',1),('q',2),('q',3),('q',4)]然后添加值; 也许这是一种更好的方法,因为我需要为几行指定一次格式.

Mar*_*ann 6

如果您已经具有expand扩展"aqqqq"到元组列表的功能,则可以通过以下方式完成剩下的工作zipWith:

Prelude> zipWith (\(p, ix) x -> (p, ix, x)) (expand fmt) row
[('a',1,100),('q',1,10),('q',2,40),('q',3,25),('q',4,25)]
Run Code Online (Sandbox Code Playgroud)

expand函数生成该类型的元组Num t => (Char, t).我调用了元组内部的值p(对于句点)和ix(对于索引).压缩元组列表row也会产生值,我在lambda表达式中简单地调用它x.