列表的重复项目

时间:2018-04-10 21:59:01

标签: f#

如果我想复制列表中的元素,我将如何进行并执行此操作? 我在考虑以下几点:

let List = [(1,2);(3,4)]
let v = List.map(fun (x,y) -> List.replicate 2 (x,y)) List

我希望结果是[(1,2); (1,2); (3,4); (3,4)]。任何建议将不胜感激。如果可能的话,我想只使用更高的订单。

3 个答案:

答案 0 :(得分:6)

我会使用列表推导来提高可读性:

let items = [ (1, 2); (3, 4) ]

let duplicated = [
    for item in items do
    yield item
    yield item
]

答案 1 :(得分:5)

您可以使用List.collect,这是F#的flatmap实现(如果您来自功能背景),SelectMany()(如果您来自C#)或{{1} (如果你来自潜在的未来版本的JavaScript)。

smooshMap

答案 2 :(得分:2)

你有几个很好的解决方案,但我想我会在原始代码中指出一些错误,特别是因为你非常接近。

  1. 尽量不要将模块名称分配给变量,因为它可能会让人感到困惑:即命名变量list而不是Listxs

  2. 由于F#中的函数是curry,通常在函数及其参数之间添加一个空格(除了与.NET相关的非curried API调用之外)。因此,请在List.map(fun x->.... )

  3. 之间添加空格
  4. 如果您不需要解构元组,您只需将其命名为一个参数x

  5. 最后,因为您List.map会产生一系列列表,您可以使用List.collectList.concat

  6. 所以:

    let xs = [(1,2);(3,4)]
    let v = List.map (fun x -> List.replicate 2 x) xs |> List.concat
    

    xs
    |> List.collect (fun x -> List.replicate 2 x)
    

    或者如果你想得到花哨的话

    xs |> (List.replicate 2 >> List.concat)