定义此类函数是否有意义
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维坐标的简单函数。
答案 0 :(得分: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"
答案 1 :(得分:2)
我会将你的函数标记为内联,以便它们可以只是
let inline squash1 (a,(b,c)) = (a,b,c)
此外,您不需要lambdas (fun ...)