【问题标题】:How to convert (int* int) list to (int: list) in F#如何在 F# 中将 (int* int) 列表转换为 (int: list)
【发布时间】:2014-11-15 06:26:37
【问题描述】:

我有一个成对的序列:Original = [(0,0); (1,2); (3,4)] 我想将此序列 (int *int) 转换为 int Final= [0,0,1,2,3,4] 的序列 任何人都可以建议我这样做的方法吗?

【问题讨论】:

    标签: list f# seq


    【解决方案1】:

    另一个选项是使用序列表达式——我很喜欢这个选项,但这是个人喜好问题:

    [ for a, b in original do
        yield a
        yield b ]
    

    【讨论】:

    • 原始列表是 2 个项目的元组列表。我应该在和 b 周围加一个括号,换句话说 [ for (a, b) in original do yield a yield b ] 吗? (我已经测试了代码,两种方式都给出了相同的结果)哪一个是正确的,为什么?>
    • 如果它们都起作用并且它们都产生相同的结果,那么它们都是正确的。只有当缺少括号导致歧义和编译器错误时,括号才在 F# 中是强制性的。
    【解决方案2】:

    使用List.collect

    [(0,0); (1,2); (3,4)] |> List.collect (fun (x,y) -> [x; y])
    

    在您的问题中,您在开头说您想要一个列表,但在结尾您说序列,无论如何,序列收集也是可用的。

    更多信息collect 是单子函数bind 或运算符>>= 在某些语言(C# 中的 SelectMany)中,对于列表/序列相当于一个映射后跟一个 concat。

    【讨论】:

      【解决方案3】:
      [(0,0); (1,2); (3,4)] |> List.map(fun (x,y)->[x; y]) |> List.concat
      

      即。将元组序列映射到列表列表,然后将列表连接在一起

      [(0,0); (1,2); (3,4)] |> Seq.map(fun (x,y)->seq { yield x; yield y}) |> Seq.concat |> Seq.toList
      

      我首先提出了更长的 Seq 版本,因为 Seq 模块传统上需要使用更多的运算符。但是,在 F# 4 中,Seq、List 和 Array 类型将具有完整的运算符覆盖范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        相关资源
        最近更新 更多