2014-01-21 4 views
2

что у меня есть F # дискриминированных союз определяется следующим образом:Преобразование Союза <'a> в Союз <'b>

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

Если у меня есть B этого где 'T является int, например, как бы я преобразовать его в другой B, где 'T является string? У меня есть союз, похожее на это, но со многими более случаями, и в настоящее время я матч шаблона, как это:

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

Смежные вопросы