2012-03-01 29 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   
    //...