2012-03-21 4 views
1

:의 포장을 풀고 튜플 나는 길이 세의 튜플 구성해야한다고 가정

(x , y, z) 

을 그리고 길이가 두 튜플 반환하는 기능이 -로 exampleFunction과 튜플의 마지막 두 요소를 이 튜플로부터 생성됩니다.

가 어떻게이 exampleFunction 두 번 호출 할 필요없이이 작업을 수행 할 수 있습니다 난 그냥하고 싶은

(x, fst exampleFunction , snd exampleFunction) 

을/

(x, exampleFunction) 

뭔가를 달성하지만 튜플은 타의 추종을 불허하는 길이가 뿌려 (당연히)

보고 있지 않다. let y,z = exampleFunction()

답변

3

내장 함수가있을 수 있지만 맞춤 함수도 마찬가지로 작동합니다.

let repack (a,(b,c)) = (a,b,c) 
repack (x,exampleFunction) 
+0

심플. 이것은 효과가있다. – manojlds

1

당신이 가진 문제는 함수 반환 a*b 그렇게 반환 형식이 'a*'b*'c에 다른 'a*('b*'c)이 최선의 해결책이

let inline flatten (a,(b,c)) = a,b,c 

같은 작은 도우미 함수는 다음

을 할 수있다 될 것입니다
(x,examplefunction) |> flatten 
+0

이유를 이해하고이를 수행 할 방법을 찾고 있습니다. 아주 간단하고, 여전히 배우고 있습니다. – manojlds

+0

@manojlds - 당신은 이런 종류의 문제에 대한 레코드 유형을 사용하는 것이 나을 것 같습니다. –

2

별도의 답변을 드릴만한 가치가 있는지는 잘 모르겠지만 위의 두 가지 답변은 모두 최적이기 때문에 ct는 도우미 함수의 호출시 중복 Tuple<'a, Tuple<'b, 'c>>입니다. 나는 사용자 지정 연산자가 가독성과 성능 모두에 더 좋을 것이라고 말할 것이다.

let inline ([email protected]) a (b,c) = a, b, c 
let result = x [email protected] yz // result is ('x, 'y, 'z) 
0

나는 공통 확장 파일에 다음과 같은 기능을 가지고있다. 유용 할 수 있습니다.

let inline squash12 ((a,(b,c) ):('a*('b*'c) )):('a*'b*'c ) = (a,b,c ) 
    let inline squash21 (((a,b),c ):(('a*'b)*'c )):('a*'b*'c ) = (a,b,c ) 
    let inline squash13 ((a,(b,c,d)):('a*('b*'c*'d))):('a*'b*'c*'d) = (a,b,c,d) 

    let seqsquash12 (sa:seq<'a*('b*'c) >) = sa |> Seq.map squash12 
    let seqsquash21 (sa:seq<('a*'b)*'c >) = sa |> Seq.map squash21 
    let seqsquash13 (sa:seq<'a*('b*'c*'d)>) = sa |> Seq.map squash13 

    let arrsquash12 (sa:('a*('b*'c) ) array) = sa |> Array.map squash12 
    let arrsquash21 (sa:(('a*'b)*'c ) array) = sa |> Array.map squash21 
    let arrsquash13 (sa:('a*('b*'c*'d)) array) = sa |> Array.map squash13