Ocaml模式与数据构造函数的匹配独立于其算术性
是否有一种方法可以与独立于构造函数算术的构造函数进行模式匹配?有时在模式匹配中,我只关心构造函数,而不关心与它相关联的数据 我担心的是,当我在ADT中更改构造函数的算术时,我必须检查并更改所有模式匹配,即使是那些丢弃数据构造函数上所有“字段”(正确的术语是什么?)的匹配 假设我有一个包含多个构造函数的ADTOcaml模式与数据构造函数的匹配独立于其算术性,ocaml,Ocaml,是否有一种方法可以与独立于构造函数算术的构造函数进行模式匹配?有时在模式匹配中,我只关心构造函数,而不关心与它相关联的数据 我担心的是,当我在ADT中更改构造函数的算术时,我必须检查并更改所有模式匹配,即使是那些丢弃数据构造函数上所有“字段”(正确的术语是什么?)的匹配 假设我有一个包含多个构造函数的ADT (* time * message *) type log_message = Warning of float * string | Error of float * str
(* time * message *)
type log_message =
Warning of float * string
| Error of float * string
我想检查这种类型的值,但只关心构造函数,我必须编写类似
let is_error_message x = match x with
| Warning _, _ -> false
| Error _, _ -> true
如果以后我想返回并在警告中添加严重性字段,请给我
type log_message =
Warning of float * string * int
| Error of float * string
我必须在is\u error\u message
中的模式中添加一个新的通配符,以满足类型检查器的要求
let is_error_message x = match x with
| Warning _, _, _ -> false
| Error _, _ -> true
类型定义
type log_message =
| Warning of float * string
| Error of float * string
这意味着两个构造函数(Warning
和Error
)都不接受两个参数,而是接受它们的乘积(即元组)。因此,您可以按如下方式进行设置:
Warning (4.0, "you better be warned")
在对该变量的实例执行模式匹配时,您可以使用\uuu
指定任意长度的元组(如果您不关心传递给构造函数的参数):
我想我的意思是说
警告(float*string)
&c。。。对于采用元组的多参数构造函数而不是一元构造函数,我只是弄乱了语法。。。(然后没有意识到为什么警告\uuu
无效)。你说的完全正确,所以我不想只是默默地解决这个问题。这是不正确的,常规构造函数的参数不是元组。\uu
可以匹配多个参数的原因是,这是作为一项功能添加的,以涵盖此用例。@gsg添加的是哪个版本?@GregoryNisbet:changelog提到它是在1996年初添加到Caml Special Light 1.13中的。@gsg看起来你是对的,的确如此。你可能会觉得这很有趣-
type log_message =
| Warning of float * string
| Error of float * string;;
let is_error_message x = match x with
| Warning _ -> false
| Error _ -> true;;
is_error_message (Warning (2.0, "totally not an error"));;
- : bool = false