在 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
}
我在 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
}