2012-03-01 4 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를 패드 통보 후 내 코드는 지금

let toTableau (seqinit:seq<'a*'b>) = 
    let inputd = seqinit |> Seq.groupBy fst |> toMap 
    let keys = seqinit |> Seq.map fst |> Set.ofSeq |> List.ofSeq 
    ... 

답변

5

왜처럼 보이는 , 나는 나 하나의 구조로 이전 'A *를'포장 재 작성 당신은 명시 적으로 쓰지 않는다 :

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

+0

잘 편집 한 질문을 편집 할 것이다. th – nicolas

2

+1 @ pad가 말한 것. 그렇지 않으면 (당신이하려는 일을 간소화하고 그런 식으로 정의 된 seqinit으로 막혀 있다면) 항상 내 생각대로 할 수 있습니다.

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