Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在F#中,如果表达式与模式匹配,则返回true?_F#_Pattern Matching - Fatal编程技术网

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

在F#中,如果表达式与模式匹配,则返回true?,f#,pattern-matching,F#,Pattern Matching,我正在寻找一种更短/更简洁的方法来执行以下等效操作(对于编译时已知的任何模式): 一般来说,有没有一种方法可以做到这一点,即当表达式与给定模式匹配时返回true?您可以使用函数稍微缩短它: let f = function ['A'::_] -> true | _ -> false 在f#中,模式本身不是值,也没有将其转换为值(*)的机制。所以,不,没有更整洁的方法 也就是说,根据您对检查模式是否匹配感兴趣的原因,您可能有其他选择。关心模式是否匹配而不关心匹配了哪些值对我来说似乎有

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


一般来说,有没有一种方法可以做到这一点,即当表达式与给定模式匹配时返回true?

您可以使用
函数稍微缩短它:

let f = function ['A'::_] -> true | _ -> false
在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. *)
...
让t=将e与->真|假->假匹配
...
如果不是,那么
(*做点什么。*)
其他的
(*做点别的。*)
...
在这种情况下,你可以考虑这样做:

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. *)
...
。。。
匹配
->(*做点什么。*)
|_u->(*做点别的。*)
...
(当然,假设测试只进行一次。)


(*)忽略和。

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

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

更近一步,但就是这样,不是吗?没有用于将模式匹配或不匹配转换为真/假的语法,也没有方法将“模式”传递给另一个函数以构建一个。。?