如果我想复制列表中的元素,我将如何进行并执行此操作? 我在考虑以下几点:
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)]。任何建议将不胜感激。如果可能的话,我想只使用更高的订单。
答案 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)
你有几个很好的解决方案,但我想我会在原始代码中指出一些错误,特别是因为你非常接近。
尽量不要将模块名称分配给变量,因为它可能会让人感到困惑:即命名变量list
而不是List
或xs
由于F#中的函数是curry,通常在函数及其参数之间添加一个空格(除了与.NET相关的非curried API调用之外)。因此,请在List.map
和(fun x->.... )
如果您不需要解构元组,您只需将其命名为一个参数x
。
最后,因为您List.map
会产生一系列列表,您可以使用List.collect
或List.concat
所以:
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)