5

これを機能させる最も良い方法を知っていますか:

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 を 1 つの構造体にパックするように書き直しました。私のコードは次のようになります。

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

2 に答える 2

7

明示的に書いてみませんか:

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

任意の数のタプル要素に対してこれを機能させたい場合は、タプルをリストに変更し、リストでパターン マッチングを採用することを検討してください。

于 2012-03-01T15:14:08.977 に答える
2

@padが言ったことに+1。それ以外の場合 (やろうとしていることを単純化し、そのように定義された seqinit に固執している場合)、いつでもできると思います:

let toTableau2D (seqinit:'a*'b*'c) =
   let toto, _, _ = seqinit          
   //...
于 2012-03-01T15:20:11.710 に答える