fsharp中的fst和3元组

nic*_*las 5 f# tuples cons iterable-unpacking

你知道最好的方法吗:

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
Run Code Online (Sandbox Code Playgroud)

必须有一个比重写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
  ...
Run Code Online (Sandbox Code Playgroud)

pad*_*pad 6

你为什么不明确地写它:

let toTableau2D (a, b, c) =
   let toto = a
   // ...
Run Code Online (Sandbox Code Playgroud)

如果您想seqinit稍后参考,您始终可以重建三元组或使用命名模式:

let toTableau2D ((a, b, c) as seqinit) =
   let toto = a
   // Do something with seqinit
   // ...
Run Code Online (Sandbox Code Playgroud)

编辑:

除非你使用反射,否则你不能使用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
   // ...
Run Code Online (Sandbox Code Playgroud)

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