我读到ocaml模式中的模式防护,其中显示了这种类型的防护:
match x with
| pat with g = y -> z
| ...
| pat with g = y -> z
然而,在OCaml 4.02中,这似乎不起作用(Syntax error: pattern expected.
)。所以问题是:是否有一种解决方法可以在模式匹配中实现这种绑定?
我想写这样的东西:
match something with
| value with y = f x when y > 0 -> value + y
这是OCaml"模式"CamlP4语法扩展。OCaml 本身没有模式保护,这个 p4 扩展将其作为语法扩展提供,在馈送到 OCaml 编译器之前,必须由 CamlP4 预处理器脱糖。
不幸的是,"模式"没有移植到 OCaml 4 中。我不知道确切的原因,但可能是由于更改OCaml内部表示的高移植成本。CamlP4非常强大,但其语法扩展很难编写和维护。实际上,OCaml社区现在正在转向PPX,这是另一个预处理器框架。PPX 无法更改 OCaml 语法本身,但那里的事情要容易得多。
最近我为模式防护编写了一个 PPX 扩展,它适用于 4.02.1:https://bitbucket.org/camlspotter/ppx_pattern_guard 。您的示例可以转换为:
match something with
| value when [%guard let y = f x;; y > 0] -> value + y
它看起来比"模式"更丑陋,但在 PPX 中,我们必须在具有一些属性和扩展的香草语法中,例如 [%guard ...]
.
此页面是关于从未真正合并到编译器ocaml-patterns
功能。目前,OCaml 没有活动模式。