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

是的,这样做是有道理的。建议避免使用 lambda 以使这些函数更易于阅读:

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

如果您经常遇到具有不同数量的内部元组,将它们转换为列表并不是一个坏主意。例如,e变成两个列表的元组:

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

我们只需要一个函数来处理序列:

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)

此外,您不需要 lambdas(fun ...)

于 2012-03-02T10:13:41.233 回答