2014-01-21 37 views
2

說,我有一個F#歧視工會的定義,像這樣:轉換一個聯盟<'a>到聯盟<'b>

type Union<'T> = | A of 'T | B | C 

如果我有這個地方'Tint例如B,我將如何將其轉換爲另一種B其中'Tstring?我也與此類似,但有更多的情況下,目前我的模式匹配這樣的工會:

let convert u = 
    match u with 
    | A(x) -> // some fancy logic here 
    | B -> B 
    | C -> C 

回答

8

此功能通常被稱爲map。第一個參數是一個函數(a -> b)改造內在價值:

let map f = function 
    | A(x) -> (A (f x)) 
    | B -> B 
    | C -> C 

你可以用它喜歡:

let stringUnion = (A(123)) |> map (fun i -> i.ToString()) 
+0

謝謝,但是這正是我在做什麼目前,我在想,如果有一種方法可以擺脫編寫'|的重複每當我創建一個新案例時,Blah - > Blah';我經常改變這個特定的聯盟。 – Jwosty