2012-03-01 32 views
4

你知道,使这项工作的最好方式:FST和fsharp 3元组

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更好的办法..

UPDATE 垫后通知,我改写了包装之前的“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 
    ... 

回答

5

为什么你不只是写它明确:

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

如果你想使这个工作的元组元素的任意数,考虑更改元组列表,并使用图案列表匹配。

+0

因为我在我的函数中有其他操作。我将编辑问题 – nicolas 2012-03-01 15:20:33

+0

以及注意。 THKS – nicolas 2012-03-01 16:19:55

2

对@pad说的+1。否则(如果你只是简化你想做的事情,并坚持seqinit定义的方式)我想你总是可以这样做:

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