匹配变量(或以其他方式引入匹配逻辑的抽象)
Match against variables (or otherwise introduce abstraction for match logic)
可以匹配文字(显然):
let res = match x with
| "abc" -> 1
| "def" as x -> something_else x
Q: 但是,是否可以匹配变量的值,从而在整个代码中不重复文字?
let abc = "abc"
let def = "def"
let res = match x with
| (abc) -> 1
...
(以上当然不会匹配 abc
,但在所有情况下都会匹配)
在F#中,可以使用活动模式:
let (|IsAbc|IsDef|) str = if str = abc then IsAbc(str)
else if str = def then IsDef(str)
...
let res = match x with
| IsAbc x -> 1
| IsDef x -> somethingElse x
这允许抽象匹配逻辑并只定义一次文字。我如何在 OCaml?
中实现这一点
我得到的最接近的是:但是感觉有点笨拙?
let is_abc str = str = abc
let is_def str = str = def
...
let res = match x with
| x when is_abc x -> 1
| x when is_def x -> something_else x
或者使用if
:但是它看起来不如match
优雅(另外,要匹配y
,n 必须进行编辑,与使用 match
)
时的 1 相比
let res = if x = abc then 1
else if x = def then something_else x
使用 when
本质上是您在 OCaml 中可以做的最好的事情。我认为它看起来并不比您提供的 F# 等价物笨拙。但这也许是一个品味问题。
您也可以分解并使用 if
表达式。这就是我个人会做的。我没有看到假装 OCaml match
比实际更通用的任何优势。
您可能会认为它与类 C 语言中的 if
和 switch
类似。如果您想与编译时已知的一组值进行比较,switch
效率更高。但它并没有试图成为一个广义的 if
.
模式匹配带来穷尽性,如果你使用变量,你更处于简单的if表达式情况。
您可能会想使用 match 来使用他优雅的语法并针对大量可能的值进行测试,例如 :
match x with
| value A -> function A
| value B -> function B
| ...
| value N -> function N
如果您遇到这种情况,您可以使用结构将值映射到相应的函数。
匹配语法非常优雅,很容易尝试在各种情况下使用它,但目的很重要,以保持语言的简单性。
您可以使用 C-style preprocessor.
#define ABC "abc"
#define DEF "def"
let res = match x with
| ABC -> 1
| DEF as x -> something_else x
可以匹配文字(显然):
let res = match x with
| "abc" -> 1
| "def" as x -> something_else x
Q: 但是,是否可以匹配变量的值,从而在整个代码中不重复文字?
let abc = "abc"
let def = "def"
let res = match x with
| (abc) -> 1
...
(以上当然不会匹配 abc
,但在所有情况下都会匹配)
在F#中,可以使用活动模式:
let (|IsAbc|IsDef|) str = if str = abc then IsAbc(str)
else if str = def then IsDef(str)
...
let res = match x with
| IsAbc x -> 1
| IsDef x -> somethingElse x
这允许抽象匹配逻辑并只定义一次文字。我如何在 OCaml?
中实现这一点我得到的最接近的是:但是感觉有点笨拙?
let is_abc str = str = abc
let is_def str = str = def
...
let res = match x with
| x when is_abc x -> 1
| x when is_def x -> something_else x
或者使用if
:但是它看起来不如match
优雅(另外,要匹配y
,n 必须进行编辑,与使用 match
)
let res = if x = abc then 1
else if x = def then something_else x
使用 when
本质上是您在 OCaml 中可以做的最好的事情。我认为它看起来并不比您提供的 F# 等价物笨拙。但这也许是一个品味问题。
您也可以分解并使用 if
表达式。这就是我个人会做的。我没有看到假装 OCaml match
比实际更通用的任何优势。
您可能会认为它与类 C 语言中的 if
和 switch
类似。如果您想与编译时已知的一组值进行比较,switch
效率更高。但它并没有试图成为一个广义的 if
.
模式匹配带来穷尽性,如果你使用变量,你更处于简单的if表达式情况。 您可能会想使用 match 来使用他优雅的语法并针对大量可能的值进行测试,例如 :
match x with
| value A -> function A
| value B -> function B
| ...
| value N -> function N
如果您遇到这种情况,您可以使用结构将值映射到相应的函数。
匹配语法非常优雅,很容易尝试在各种情况下使用它,但目的很重要,以保持语言的简单性。
您可以使用 C-style preprocessor.
#define ABC "abc"
#define DEF "def"
let res = match x with
| ABC -> 1
| DEF as x -> something_else x