2012-03-01 4 views
4

Вы знаете, самый хороший способ, чтобы сделать эту работу:FST и 3-кортеж FSharp

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 После консультации площадки Я переписал упаковка предыдущий «а *» Ь в единую структуру Мой код теперь выглядит

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

EDIT:

Если вы не используете отражение, вы не можете использовать функцию 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

+0

хорошо отмеченный. Thks – nicolas

2

+1 к чему @pad сказал. В противном случае (если вы просто упростили то, что вы пытаетесь сделать, и застряли в seqinit, определенном таким образом), я думаю, вы всегда можете:

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

 Смежные вопросы

  • Нет связанных вопросов^_^