F# - 如何制作列表中的元素副本?

J M*_*Mei 1 f# list

我想写一些可以复制列表中所有元素的东西.所以,如果我想要2个列表

[1; 2; 3; 4]
Run Code Online (Sandbox Code Playgroud)

它会成为

[1; 1; 2; 2; 3; 3; 4; 4]
Run Code Online (Sandbox Code Playgroud)

所以我打算用递归方式编写一个函数

let rec dupeElem row count =
  match row with
  | [] -> []
  | hd::tl -> (makeCopy hd count) @ dupeElem tl count
Run Code Online (Sandbox Code Playgroud)

其中count是我想要的副本数.该函数将获取列表中的每个头元素并将其发送到复制功能,以使副本插入到列表中.然后makeCopy看起来像:

let makeCopy elem Count =
  match Count with 
  | 0 -> []
  | 1 -> elem
  | 2 -> elem :: elem
  |....
Run Code Online (Sandbox Code Playgroud)

但是当它返回dupeElem时我会收到错误.我知道做难事并不是最明智的想法,而是测试它是否可行.我将如何修复/改进我的工作?

s95*_*163 7

只是为了非递归解决方案:

let xs = [1; 2; 3; 4; 5]
xs |> List.collect (fun x -> List.replicate 3 x)
//val it : int list = [1; 1; 1; 2; 2; 2; 3; 3; 3; 4; 4; 4; 5; 5; 5]
Run Code Online (Sandbox Code Playgroud)