F#: downcast a discriminated union

casting, discriminated-union, downcast, f#

Solution

You cannot really cast discriminated union value - the type of `F` is a different thing than the type `int` (it is not like C union where they have the same binary representation).

So, the easiest solution is to write a function that takes `list<F>` and returns `list<int>` containing only the `int` values that were wrapped in the `A` case.

To do this, you can use `List.choose` (instead of `List.filter`). This lets you specify a projection where you can return `None` (meaning skip the value) or `Some v` (meaning return value `v` as part of the resulting list):

let listOfAs = List.choose (fun f -> 
  match f with 
  | A(f') -> Some f'
  | _ -> None)

Problem

I have a discriminated union type: ``` type F = | A of int | B of float ``` Suppose I have a list of F that has been filtered to yield only objects of type A: ``` let listOfAs=list.filter (fun f -> match f with | A(f') -> true | _ -> false) ``` How can I work with the resulting list of F without requiring pattern matches everywhere in my code? The compiler doesn't like a direct cast, eg ``` list.map (fun f -> int f) listOfAs ```

Original source