2

我在 F# 中工作,并且有一个 T 类型,它是几件事的有区别的联合:

type T =
  | A of string * int
  | B of int
  | C

如果我有一个 T 列表,我可能想取出使用 A 构造的东西。像这样进行模式匹配很容易:

myList
|> List.filter (fun x -> match x with | A(_,_) -> true | _ -> false)

嵌入的匹配有点冗长,并且在保持下划线数量与 A 的定义同步方面存在一些小的维护麻烦。我真的很喜欢这样的函数:

let constructedFrom (type constructor) (t : T) : bool = something

myList
|> List.filter (constructedFrom A)

有没有办法定义这个“constructedFrom”函数?

4

2 回答 2

6

嵌入的匹配有点冗长,并且在保持下划线数量与 A 的定义同步方面存在一些维护麻烦。

function您可以使用关键字保存一些击键。您也可以将_其用作忽略所有内容的模式(这并不意味着您必须绑定到单个值)。

myList
|> List.filter (function A _  -> true | _ -> false)

一般来说,如果你重复写上面的函数,你应该定义一些活动模式,每种情况一个:

let (|ACase|_|) = function 
    | A _ as x -> Some x 
    | _ -> None

myList |> List.choose (|ACase|_|)

有没有办法定义这个“constructedFrom”函数?

没有惯用的方法可以做到这一点。我认为主动模式在大多数情况下都可以解决问题。

于 2013-11-24T06:02:13.247 回答
4

您可以通过使用代替来简化match您的。= 。List.filterfunctionfunfunctionfun x -> match x with

myList
|> List.filter (function A(_,_) -> true | _ -> false)

我认为没有一种方法(或至少是一种方法)来定义您的constructedFrom功能。

于 2013-11-24T05:52:11.000 回答