在 F# 中找出一个受歧视的联合案例?

Pulling out one discriminated union case in F#?

假设我有这样一个 DU:

type Fruit = 
| Apple of string * bool
| Banana of string
| Cherry of string

然后我有一个这样的集合:

fruits : Fruit list

我想提取所有 Apple 个实例来执行一些计算:

// apples is Seq<string * bool> 
let apples = 
  fruits
  |> Seq.choose (fun x -> 
    match x with 
    | Apple a -> Some a
    | _ -> None
  )

我的问题是:有没有更简洁的写法?

类似于:

// Not real code
let apples = 
  fruits
  |> Seq.match Apple

可以稍微简洁一点;你不必使用 Seq.choose:

let apples = fruits |> List.filter (fun fruit -> match fruit with Apple _ -> true | _ -> false)

如果您在更多地方需要它,请将 lambda 提取到辅助函数中

let isApple = function | Apple _ -> true | _ -> false

真的不多。这是最简洁的:

let apples = 
  fruits
  |> Seq.choose (function Apple(a,b) -> Some(a,b) |_-> None)