5

我在code.google.com上阅读了有关模式保护的信息,其中显示了这种类型的保护:

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

提前谢谢,干杯。

4

2 回答 2

5

这就是 OCaml“模式”CamlP4 语法扩展。OCaml 本身没有模式保护,并且这个 p4 扩展将其作为语法扩展提供,在提供给 OCaml 编译器之前必须由 CamlP4 预处理器去糖。

不幸的是,“模式”没有移植到 OCaml 4。我不知道确切原因,但可能是由于更改 OCaml 内部表示的移植成本很高。CamlP4 非常强大,但它的语法扩展很难编写和维护。实际上,OCaml 社区现在正在转向 PPX,另一个预处理器框架。PPX 不能更改 OCaml 语法本身,但那里的事情要容易得多。

最近我写了一个适用于 4.02.1 的模式防护 PPX 扩展:https ://bitbucket.org/camlspotter/ppx_pattern_guard 。您的示例可以翻译为:

match something with
| value when [%guard let y = f x;; y > 0] -> value + y

它看起来比“模式”更难看,但在 PPX 中,我们必须在带有一些属性和扩展名(如[%guard ...].

于 2014-12-10T00:16:58.203 回答
0

这个页面是关于ocaml-patterns从未真正合并到编译器中的功能。目前,OCaml 没有活动模式。

于 2014-12-09T20:28:32.677 回答