2014-01-21 66 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