在 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)
假设我有这样一个 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)