fst and 3-tuple in fsharp



你知道实现这一点的最佳方法吗:

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*"打包成一个单一的结构我的代码现在看起来像

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

为什么不直接写出来:

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
   // ...

如果您想让这项功能适用于任意数量的元组元素,请考虑将元组更改为列表,并在列表上使用模式匹配。

+1对@pad所说的话。否则(如果你只是简化了你想做的事情,并坚持用这种方式定义seqinit)我想你总是可以做到:

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

相关内容

  • 没有找到相关文章

最新更新