2012-03-21 136 views
1

想我需要构建三个长度的元组:解压元组到另一个元组

(x , y, z) 

而且我返回长度为2的元组的功能 - exampleFunction和元组的最后两个元素是构造来自这个元组。

我怎么能做到这一点,而不必调用exampleFunction两次:

(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 2012-03-21 23:48:47

1

你的问题是,该函数返回a*b这样的返回类型变得'a*('b*'c)这是'a*'b*'c不同的最佳解决方案就像是

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

小助手功能,那么你可以做

(x,examplefunction) |> flatten 
+0

是啊明白为什么,寻找一种方法来做到这一点。很简单,仍在学习:) – manojlds 2012-03-21 23:47:51

+0

@manojlds - 你可能会更好使用记录类型来解决这类问题 – 2012-03-22 00:22:20

2

我不确定它是否值得一个单独的答案,但上面提供的答案都不是最优的,因为无论是解构一旦调用辅助函数,就会有多余的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 
相关问题