1

長さ3のタプルを作成する必要があるとします。

(x , y, z)

そして、長さ2のタプルを返す関数がありますexampleFunction。構築されるタプルの最後の2つの要素は、このタプルからのものです。

exampleFunction2回電話することなくこれを行うにはどうすればよいですか?

(x, fst exampleFunction , snd exampleFunction)

私はただやりたい/何かのようなことを達成したい

(x, exampleFunction)

しかし、タプルの長さが比類のないものであると文句を言います(もちろん)

やっていないlet y,z = exampleFunction()

4

4 に答える 4

3

組み込み関数があるかもしれませんが、カスタム関数も同様に機能します。

let repack (a,(b,c)) = (a,b,c)
repack (x,exampleFunction)
于 2012-03-21T23:42:17.860 に答える
2

Tuple<'a, Tuple<'b, 'c>>別の答えの価値があるかどうかはわかりませんが、ヘルパー関数の呼び出し時に両方が冗長に構築されるため、上記の両方の答えは最適ではありません。読みやすさとパフォーマンスの両方の点で、カスタム演算子の方が優れていると思います。

let inline ( +@ ) a (b,c) = a, b, c
let result = x +@ yz // result is ('x, 'y, 'z)
于 2012-03-22T04:03:53.377 に答える
1

あなたが持っている問題は、関数が戻るので、最良の解決策とは異なるa*b戻り型になるということです。'a*('b*'c)'a*'b*'c

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

その後、あなたはすることができます

(x,examplefunction) |> flatten
于 2012-03-21T23:45:17.913 に答える
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
于 2012-03-22T09:46:45.960 に答える