【问题标题】:Replicate list items n times in a F# sequence在 F# 序列中复制列表项 n 次
【发布时间】:2017-05-01 13:26:18
【问题描述】:

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

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

【问题讨论】:

    标签: f# seq


    【解决方案1】:

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

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

    然后

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        其实有一个复制功能:

        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
        

        【讨论】:

        • 在 F# 4.x 上,是的。
        猜你喜欢
        • 2016-01-07
        • 2020-01-26
        • 1970-01-01
        • 2011-03-28
        • 2020-11-19
        • 2018-02-25
        • 2021-04-15
        • 1970-01-01
        相关资源
        最近更新 更多