list - 在 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)]
然后添加值;也许这是一种更好的方法,因为我需要为几行指定一次格式。
解决方案
如果您已经有一个函数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
.
推荐阅读
- c# - 使用 foreach 循环和 LINQ 的操作有什么区别?
- swift - 调用中的参数标签不正确(有'uiImage:',预期'来自:')
- javascript - 如何将输入限制在一个值范围内
- visual-studio-code - 无论如何以编程方式重新启动我的 VSCODE 扩展?
- python - 我的海龟没有检测到输入,它可以越过边界
- makefile - 双向编解码器的 Makefile
- java - ANDROID:MVVM + Retrofit:我应该如何以及在哪里从 JSON 对象数组中检索 JSON 对象列表?
- ios - 如何使用短信实现inapp purchase iOS web app
- javascript - 遍历选择中的所有选项并将值添加到选项名称
- string - 在 SPARQL 中反转字符串