首页 > 解决方案 > 具有联合类型的过滤器列表

问题描述

我是 F# 和 fp 的新手。我尝试使用可区分的联合类型作为参数过滤列表。在我的示例中,我希望所有具有 A 型的人。我该如何解决这个问题,或者这是一个不好的方法?

type U =
    | A of AA
    | B of BB
    | C

and AA = {
    Id: string
}

and BB = {
    Id: string
}


let list = [ A { Id = "0" }; B { Id = "1" }; C; A { Id = "2"}]
let filter (union: U) = list |> List.filter(fun x -> x = union)

let resultOne = filter A //Error
let resultTow = filter C //Ok

谢谢你。

标签: f#

解决方案


要做到这一点,通常的方法是创建一个辅助函数,然后将其用作参数List.filter

let isA u = match u with
    | A _ -> true
    | _ -> false

let resultOne = list |> List.filter isA

或者您可以将辅助函数内联,而不给它命名:

let resultOne = list |> List.filter (fun u -> match u with A _ -> true | _ -> false)

或者,如果你真的很简洁,你可以使用function语法(它是 sugar for fun x -> match x with):

let resultOne = list |> List.filter (function A _ -> true | _ -> false)

推荐阅读