在F#中,如果表达式匹配模式,则返回true?

时间:2014-03-09 16:44:22

标签: f# pattern-matching

我正在寻找一种更短/更简洁的方法来完成以下相同的操作(对于在编译时已知的任何模式):

let f x = match x with | ['A'::_] -> true ; | _ -> false

是否有一种方法可以执行此操作,即如果表达式与给定模式匹配则返回true?

3 个答案:

答案 0 :(得分:10)

您可以使用function稍微缩短它:

let f = function ['A'::_] -> true | _ -> false

答案 1 :(得分:4)

在f#中,模式本身不是值,并且没有将它们转换为值(*)的机制。所以,不,没有更简洁的方式。

也就是说,您可能还有其他选项,具体取决于为什么您有兴趣检查模式是否匹配。关心模式是否匹配而不是关于哪些值匹配似乎对我来说有点不寻常,所以也许有重构的机会。

举个简单的例子,假设你这样做:

let t = match e with <pattern> -> true | _ -> false 
...
if t then
    (* Do something. *)
else 
    (* Do something else. *)
...

在这种情况下,你可以考虑这样做:

...
match e with 
  <pattern> -> (* Do something. *)
| _         -> (* Do something else. *)
...

(假设测试只发生一次,当然。)

(*)忽略reflectionquotations

答案 2 :(得分:3)

您可能会在这里想到一个活动模式,特别是它的单个案例形式。它允许您创建一个返回布尔值的模式:

let (|F|) = function 
    | ['A'::_] -> true
    | _ -> false

let (F x) = [['A']] // val x : bool = true

可以参数化活动模式。在它接受的(n + 1)个参数中,第一个n被传递给语法函数,最后一个参数是匹配的值。

let (|G|) e = function
    | [d::_] when d = e -> true
    | _ -> false

let (G 'A' y) = [['A']] // val y : bool = true