首页 > 解决方案 > 在 Haskell 的元组列表中累积值计数

问题描述

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

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)]

我想应该有一些比这段代码更具可读性和性能的东西,甚至是一个了不起的单行。

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

标签: listhaskellcountiteration

解决方案


如果您已经有一个函数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)]

expand函数生成类型为 的元组Num t => (Char, t)。我调用了该元组中的值p(对于period)和ix(对于index)。压缩该元组列表row也会产生值,我在 lambda 表达式中简称为x.


推荐阅读