2012-03-21 7 views
1

開梱タプル私は長さ3のタプル構築する必要があるとし

(x , y, z) 

をそして、私は長さ2のタプルを返す関数である - ことをexampleFunctionとタプルの最後の2つの要素をこのタプルから生成されます。

私はexampleFunction 2回呼び出すことなく、これを行うことができます方法:

(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 
関連する問題