gpt4 book ai didi

types - 在 OCaml 中匹配总和类型时绑定(bind)名称

转载 作者:行者123 更新时间:2023-12-02 09:22:45 24 4
gpt4 key购买 nike

在 OCaml 中,是否可以在模式匹配时将名称绑定(bind)到数据构造函数的内部?作为说明性示例,假设我有以下 OCaml 程序:

type t = A of int * int | B of int * int

let sum_pair (a, b) = a + b

let f x = match x with
| A (a1, a2) -> sum_pair (a1, a2)
| B (_, b) -> b

let _ = Printf.printf "%d\n" (f (A (1, 2)))

这可以编译,但相当烦人的是我需要在匹配后重建元组(a1, a2)以将其传递给sum_pair!相反,我希望能够写

let f x = match x with
| A (_ as pair) -> sum_pair pair
| B (_, b) -> b

但这会失败,并显示“错误:构造函数 A 需要 2 个参数,但此处应用于 1 个参数。”写作

let f x = match x with
| A _ as pair -> sum_pair pair
| B (_, b) -> b

也好不到哪去,因为这会将 pair 绑定(bind)到整个值,而不是其中的对。 (这也无法编译,正如您所期望的:“此表达式具有类型 t,但表达式应为 int * int 类型。”)

最佳答案

如果你这样定义类型,你就可以做到这一点:

type t = A of (int * int) | B of (int * int)

这意味着构造函数 A 实际上接受一个 参数,该参数是一对。在您的原始定义中,它需要两个不是一对的 int 参数,并且没有办法解决这个问题。

# type t = A of (int * int) | B of (int * int);;
type t = A of (int * int) | B of (int * int)

# let sum_pair (a, b) = a + b

let f x = match x with
| A p -> sum_pair p
| B (_, b) -> b
;;
val sum_pair : int * int -> int = <fun>
val f : t -> int = <fun>

# f (A (5, 7));;
- : int = 12

这是 OCaml 语法的一个棘手点。这是最近的另一个讨论:'as' Keyword in Pattern Matching Behaving Strangely .

关于types - 在 OCaml 中匹配总和类型时绑定(bind)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40669024/

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