0

そのような関数を定義することは理にかなっていますか?

let squash12 (e:('a*('b*'c)   )) = e |> (fun (a,(b,c)  ) -> (a,b,c  ))
let squash21 (e:(('a*'b)*'c   )) = e |> (fun ((a,b),c  ) -> (a,b,c  ))
let squash13 (e:('a*('b*'c*'d))) = e |> (fun (a,(b,c,d)) -> (a,b,c,d))

let seqsquash12 (sa:seq<'T>) = sa |> Seq.map squash12
let seqsquash21 (sa:seq<'T>) = sa |> Seq.map squash21
let seqsquash13 (sa:seq<'T>) = sa |> Seq.map squash13

コア コードを再帰的にする (ネストされたタプルにつながる) 別の方法を見つけることができませんでしたが、一般化された n 次元座標にマップする単純な関数を公開しました。

4

2 に答える 2

2

はい、そうするのは理にかなっています。これらの関数を読みやすくするために、ラムダを避けることをお勧めします。

let squash12 (a, (b, c)) = a, b, c

さまざまなアリティを持つ内部タプルに頻繁に遭遇する場合、それらをリストに変換することは悪い考えではありません。たとえば、eは 2 つのリストのタプルになります。

(a, (b, c)) ~> ([a], [b; c])
(a, b), c) ~> ([a; b], [c])
(a, (b, c, d)) ~> (a, [b; c; d])

また、シーケンスに必要な関数は 1 つだけです。

let seqsquash sa = sa |> Seq.map (@)

問題は、入力のサイズを制御できなくなることです。リストのパターン マッチングが役立つ場合があります。

let squash12 (xs, ys) = 
   match xs, ys with
   | [a], [b; c] -> xs, ys
   | _ -> failwith "Wrong input size"
于 2012-03-02T10:12:35.343 に答える
2

私はあなたの関数をインラインとしてマークしていたので、

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

また、ラムダは必要ありません(fun ...)

于 2012-03-02T10:13:41.233 に答える