FST и 3-кортеж в Fsharp - PullRequest
       35

FST и 3-кортеж в Fsharp

5 голосов
/ 01 марта 2012

Знаете ли вы, какой самый лучший способ сделать эту работу:

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

ОБНОВЛЕНИЕ После совета по пэдуЯ переписал упаковку предыдущего '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
  ...

Ответы [ 2 ]

6 голосов
/ 01 марта 2012

Почему бы вам просто не написать это явно:

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 голосов
/ 01 марта 2012

+ 1 к тому, что сказал @pad.В противном случае (если вы просто упростили то, что пытаетесь сделать и застряли с seqinit, определенным таким образом), я думаю, вы всегда можете сделать:

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