【问题标题】:OCaml Pattern Matching For Custom Type自定义类型的 OCaml 模式匹配
【发布时间】:2021-12-13 07:51:00
【问题描述】:

我是 OCaml 的新手。我正在开发一个具有以下自定义类型的项目:

type ('a, 'b) holder = 'a * 'a * 'b option

我正在尝试在持有人列表上折叠一个函数,但无法弄清楚如何进行模式匹配> 我还需要能够访问持有人中的值。我试过了:

match currently_holder with
|[] -> acc
|(a0, a1, b0) -> a1::acc

感谢您的帮助。如前所述,我非常缺乏经验,并且刚刚开始使用自定义类型。谢谢!

【问题讨论】:

  • 最好将我们看到的错误也包括在内。编程时的错误很有帮助。

标签: pattern-matching ocaml


【解决方案1】:

您的示例代码没有意义,因为这两种模式具有完全不同的类型。模式[] 匹配一个列表(特别是一个空列表),模式(a0, a1, b0) 匹配一个三元组。

您的类型holder 是一个三元组,因此只有第二个模式有效。

假设currently_holder('a, 'b) holder 类型的值,您可以这样匹配它以区分第三个元素的两种情况(NoneSome x):

match currently_holder with
| (a0, a1, None) -> (* Case where b is not present *)
| (a0, a1, Some b0) -> (* Case where b is present *)

但是,您不需要 match 表达式来提取元组的各个部分:

let (a0, a1, b0opt) = currently_holder in
.  .  .

这里b0opt 绑定到'b opt 类型的值。

【讨论】:

  • 此外,如果您只需要例如该元组的第一个元素,则可以将 _ 用于您不关心的值。 let (a, _, _) = currently_holder
猜你喜欢
  • 2018-08-19
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多