【问题标题】:fst and 3-tuple in fsharpfsharp 中的 fst 和 3 元组
【发布时间】:2012-03-01 15:02:15
【问题描述】:

你知道完成这项工作的最佳方法吗:

let toTableau2D (seqinit:seq<'a*'b*'c>) =
   let myfst = fun (a,b,c) -> a
   let myscd = fun (a,b,c) -> b
   let mytrd = fun (a,b,c) -> c

   let inputd = seqinit |> groupBy2 myfst myscd

肯定有比重写 fst 更好的方法..

更新 在 pad 建议之后,我重写了将之前的 'a*'b 打包成一个结构 我的代码现在看起来像

let toTableau (seqinit:seq<'a*'b>) =
  let inputd = seqinit |> Seq.groupBy fst |> toMap
  let keys =  seqinit |> Seq.map fst |> Set.ofSeq |> List.ofSeq
  ...

【问题讨论】:

    标签: f# tuples iterable-unpacking cons


    【解决方案1】:

    为什么不直接写出来:

    let toTableau2D (a, b, c) =
       let toto = a
       // ...
    

    如果你以后想引用seqinit,你总是可以重构三元组或使用命名模式:

    let toTableau2D ((a, b, c) as seqinit) =
       let toto = a
       // Do something with seqinit
       // ...
    

    编辑:

    除非您使用反射,否则您不能对任何类型的元组使用 fst 函数。在您的示例中,编写一些实用程序函数并重用它们并没有什么坏处:

    let fst3 (a, _, _) = a
    let snd3 (_, b, _) = b
    let thd3 (_, _, c) = c
    
    let toTableau2D (seqinit: seq<'a*'b*'c>) =
       let inputd = seqinit |> groupBy2 fst3 snd3
       // ...
    

    如果您想对任意数量的元组元素进行此操作,请考虑将元组更改为列表并在列表上使用模式匹配。

    【讨论】:

    • 因为我的函数中有其他操作。我将编辑问题
    【解决方案2】:

    +1 @pad 所说的。否则(如果你只是简化了你正在尝试做的事情并且坚持以这种方式定义的 seqinit)我想你总是可以这样做:

    let toTableau2D (seqinit:'a*'b*'c) =
       let toto, _, _ = seqinit          
       //...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多