转换联盟<'a>联盟< b>

时间:2014-01-21 13:37:28

标签: generics f# discriminated-union

假设我有一个如此定义的F#区别联盟:

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

例如,如果B 'T intB,我将如何将其转换为另一个'T,其中string为{ {1}}?我有一个类似的联盟,但有更多的情况,目前我模式匹配像这样:

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

1 个答案:

答案 0 :(得分: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())