1

假设我需要构造一个长度为 3 的元组:

(x , y, z)

我有一个函数,它返回一个长度为 2exampleFunction的元组——要构造的元组的最后两个元素来自这个元组。

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

(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

I have the following function in my common extension file. You may find this useful.

   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 回答