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

Jwo*_*sty 2 generics f# discriminated-union

假设我有一个F#区别联合定义如下:

type Union<'T> = | A of 'T | B | C
Run Code Online (Sandbox Code Playgroud)

如果我有B这个地方'Tint例如,我将如何转换到另一个B地方'Tstring?我有一个类似于此的联合,但有更多的情况,目前我模式匹配如下:

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

Lee*_*Lee 8

通常调用此函数map.第一个参数是一个(a -> b)转换内部值的函数:

let map f = function
  | A(x) -> (A (f x))
  | B -> B
  | C -> C
Run Code Online (Sandbox Code Playgroud)

您可以像以下一样使用它:

let stringUnion = (A(123)) |> map (fun i -> i.ToString())
Run Code Online (Sandbox Code Playgroud)