将具有区别联合类型的列表过滤到单个类型

Car*_*ngo 12 f#

给定一种类型

type C = Circle of int | Rectangle of int * int
Run Code Online (Sandbox Code Playgroud)

和一个集合

let l = [ Circle(1); Circle(2); Rectangle(1,2)]
Run Code Online (Sandbox Code Playgroud)

我只想处理圈子

 let circles = l |> List.filter(fun x-> match x with 
                                        | Circle(l) -> true
                                        | _ -> false)
Run Code Online (Sandbox Code Playgroud)

但我的圈子仍然是C型,所以我做不到

for x in circles do
  printf "circle %d" x.??
Run Code Online (Sandbox Code Playgroud)

我要做

for x in circles do
  match x with 
  | Circle(l) -> printf "circle %d" l
  | _ -> ())
Run Code Online (Sandbox Code Playgroud)

好像错了..

Jac*_* P. 31

使用List.choose-就像List.filterList.map集于一身.

let circles =
    l |> List.choose(fun x ->
        match x with 
        | Circle l -> Some l
        | _ -> None)

for x in circles do
  printf "circle %d" x
Run Code Online (Sandbox Code Playgroud)