【发布时间】:2018-10-12 23:04:21
【问题描述】:
假设我有以下内容:
data D = A Int | B Int deriving Show
我有一个函数
simplify :: [D] -> [D]
我的目标是简化创建一个新列表,它将所有值与数据 A 相加(到数据 A 的单个值中)并保持 B 数据不变。
例如,[A 1, A 2, A 3, B 1, A 4, B 2] 将变为 [A 10, B 1, B 2]。
我知道我可以用 foldl 做到这一点:
A (foldl (+) 0 [x | A x <- ll]) : [B x | B x <- ll]
但这涉及到遍历列表两次寻找构造函数。
我想知道是否有一种使用分区的方法,我可以将列表分成有数据A 和没有数据的列表。
【问题讨论】:
-
如果你对列表进行分区,然后遍历分区,你仍然会遍历列表两次。
-
如果我运行分区并获取列表a和b,我不能折叠a并与b连接吗?我不必再次将 B 数据与列表进行模式匹配