在 F# 序列中复制列表项 n 次

Replicate list items n times in a F# sequence

我在 F# 中有一个序列:

let n = 2

let seq1 = {
    yield "a"
    yield "b"
    yield "c"
}

我想打印序列中的每一项 n 次。我可以这样做:

let printx line t = 
    for i = 1 to t do
        printfn "%s" line

seq1 |> Seq.iter (fun i -> printx i n)

这个输出是:
一个
一个
b
b
c
c

我认为这不是最好的解决方案。如何复制序列中的项目?

您可以创建一个函数来复制输入序列的每个元素:

let replicateAll n s = s |> Seq.collect (fun e -> Seq.init n (fun _ -> e))

然后

seq1 |> replicateAll 2 |> Seq.iter (printfn "%s")

其实还有一个replicate函数:

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]

你可以在上面做函数组合,这将摆脱 lambda:

let repCol n xs = (List.replicate >> List.collect) n xs

我宁愿使用序列计算表达式。
看起来更干净:

let replicateAll n xs = seq {
  for x in xs do
    for _ in 1..n do
      yield x
}