2012-03-21 58 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 
相關問題