你知道最好的方法吗:
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
...
答案 0 :(得分:6)
为什么不明确地写它:
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
// ...
如果要对任意数量的元组元素进行此操作,请考虑将元组更改为列表并在列表上使用模式匹配。
答案 1 :(得分:2)
+1 @pad说的话。否则(如果你只是简化了你想要做的事情并且被seqinit这样定义的话)我想你总能做到:
let toTableau2D (seqinit:'a*'b*'c) =
let toto, _, _ = seqinit
//...