2014-11-24 42 views
4

我有一个区分联合类型:F#:垂头丧气鉴别联合

type F = 
| A of int 
| B of float 

假设我有一个已经被过滤,得到A型的唯一对象f的列表:

let listOfAs=list.filter (fun f -> match f with | A(f') -> true | _ -> false) 

如何我可以使用F的结果列表而不需要我的代码中的任何模式匹配吗?编译器不喜欢直接的演员,如

list.map (fun f -> int f) listOfAs 

回答

8

你真的不能投歧视工会的价值 - F种类比类型int不同的东西(它不是像C联盟,他们具有相同的二进制表示)。

所以,最简单的解决方案是将写一个函数,采用list<F>和仅含有被包裹在所述的情况下Aint值返回list<int>

为此,您可以使用List.choose(而不是List.filter)。这使您可以指定投影在那里你可以返回None(指跳过值)或Some v(指返回值v作为结果列表的一部分):

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

在一个侧面说明,该代码可以由一个被缩短通过用'function'关键字替换'fun f - >'并删除'match'行。 – Vandroiy 2014-11-24 20:00:25

+3

是的,它可以是:-)我通常不会在显示代码时这样做,因为它需要一次解释两件事情! – 2014-11-25 14:09:15