【发布时间】:2010-09-15 14:41:30
【问题描述】:
我有一个这样的列表:(伪符号)
(X,...) -> (X,...) -> (X,...) -> ...
| | |
V V V
(Y,...) (Y,...) (Y,...)
| | |
V V V
(Z,...) (Z,...) (Z,...)
类型是(Enum a, Bounded a) => [[(a,x)]]。但我需要这样的东西:
(X, ... -> ... -> ... -> ...
|
V
(Y, ... -> ... -> ... -> ...
|
V
(Z, ... -> ... -> ... -> ...
类型如(Enum a, Bounded a) => [(a,[x])]
x 有任意数量的元素。可以假设,x 的每个成员都是第一个列表的每个子列表中的一个键。
如何将这种转换作为惰性 Haskell 算法进行(不需要对 List 进行完全评估以返回(部分)结果)?
测试数据
见上文,类似这样:
--Input
[[(Foo,1),(Bar,1),(Baz,1)],[(Foo,2),(Bar,2),(Baz,2)],...]
--Output
[(Foo,[1,2,3,...]),(Bar,[1,2,3,...),(Baz,[1,2,3,...])]
我想对数据做什么
我想在这样的函数中使用它:
myFunc :: [(MyEnum,[Int])]
myFunc x@((_,(_:[])):_) = x
myFunc x = foldTheListRecursively
该函数必须处理大量数据(每个枚举约 10,000 个条目),该列表应该由运行时系统进行垃圾回收(该列表是由程序的另一部分临时构建的)
我的(丑陋的)实现
是这样的,我实现了,但是显然不符合要求,因为列表被遍历了多次:
restructList :: [[(a,x)]] -> [(a,[x])]
resturctList list = (\x -> (x,listFor x)) <$> keys where
keys = fst <$> head list
listFor x = snd <$> any ((==x).fst) <$> list
我不在家所以无法测试,所以可能有错误。
【问题讨论】:
-
你的第一件事应该是 [[(x,a)]] 吗?这有点令人困惑。是枚举和有界的 x 吗?
标签: list haskell transformation