FSHARPのFSTと3タプル
-
14-11-2019 - |
質問
この作品を作るための最も良い方法を知っていますか:
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
...
解決
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.
他のヒント
+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
//...