Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
  ...
like image 911
nicolas Avatar asked Mar 01 '12 15:03

nicolas


2 Answers

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.

like image 143
pad Avatar answered Sep 22 '22 21:09

pad


+1 to what @pad said. Otherwise (if you just simplified what you're trying to do and are stuck with seqinit defined that way) I guess you can always do:

let toTableau2D (seqinit:'a*'b*'c) =
   let toto, _, _ = seqinit          
   //...
like image 29
Paolo Falabella Avatar answered Sep 22 '22 21:09

Paolo Falabella