Search code examples
f#tuplesiterable-unpackingcons

fst and 3-tuple in fsharp


Do you know the nicest way to make this work :

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

there must be a better way than rewriting fst..

UPDATE After pad advice, I rewrote packing the previous 'a*'b into a single structure My code now looks like

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

Solution

  • Why don't you just write it explicitly:

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

    If you want to refer to seqinit later on, you always can reconstruct the triple or use the named pattern:

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

    EDIT:

    Unless you use reflection, you cannot have fst function for any kind of tuples. In your example, writing some utility functions and reusing them doesn't hurt:

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

    If you want to make this work for arbitrary number of tuple elements, consider changing tuples to lists and employing pattern matching on lists.