F#中的高效列表组合

时间:2016-05-23 11:11:34

标签: list recursion optimization f# append

我目前正在使用以下功能:

 let rec combine xss = function
  | [] -> []
  | ys::yss -> List.map ((@) ys) xss @ combine xss yss

它以下列方式组合了两个列表列表:

combine [["x"];["a"];["c"]] [["u"];["h"];["p"]]

给出了这个结果:

[["u"; "x"]; ["u"; "a"]; ["u"; "c"]; ["h"; "x"]; ["h"; "a"]; ["h"; "c"];
["p"; "x"]; ["p"; "a"]; ["p"; "c"]]

这完全是我想要的,但是..我目前正在使用这种方法,而且数据已经变得如此巨大,以至于程序目前无法运行。
有没有办法快速运行列表列表?列表包含大约1100个元素,里面的列表每个包含大约10个元素。只是加快一点速度!

编辑:

上面列出的示例可能不太好,只是为了展示它正在做什么。我实际使用的数据结合了这种预定义类型的列表列表:

    type atom = ANum of float | AExponent of string * int 
              | ADiv of atom list list * atom list list | ARoot of expr * int

此处使用的expr类型对组合方法不感兴趣。

特别是在我的代码中,我可能会做一些像(在比赛中)一样糟糕的事情:

     | ADiv(all3,all4) -> ADiv((combine all2 all3)@(combine all1 all4),combine all2 all4)

allx为上述类型的atom list list

这有什么解释呢?

0 个答案:

没有答案