gpt4 book ai didi

Ocaml 模式与数据构造函数的匹配与其数量无关

转载 作者:行者123 更新时间:2023-12-01 12:19:17 24 4
gpt4 key购买 nike

有没有一种方法可以针对独立于构造函数元数的构造函数进行模式匹配?有时在模式匹配中我只关心构造函数而不关心与之关联的数据。

我担心的是,当我在 ADT 中更改构造函数的元数时,我必须遍历并更改我的所有模式匹配,即使是丢弃所有“字段”(正确的术语是什么?)数据构造器。

假设我有一个带有多个构造函数的 ADT

(* 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_error_message 中的模式添加一个新的通配符以满足类型检查器的要求。

let is_error_message x = match x with
| Warning _, _, _ -> false
| Error _, _ -> true

最佳答案

类型定义

type log_message = 
| Warning of float * string
| Error of float * string

表示两个构造函数(WarningError)不接受两个参数,而是接受它们的乘积(即元组)。所以你实例化如下:

Warning (4.0, "you better be warned")

当对该变体的实例执行模式匹配时,您可以只使用 _ 指定任意长度的元组(如果您不关心传递给构造函数的参数):

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

关于Ocaml 模式与数据构造函数的匹配与其数量无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45647460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com