OCaml" with"保护模式匹配

时间:2014-12-09 18:25:37

标签: functional-programming pattern-matching ocaml pattern-guards

我在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

先谢谢,欢呼。

2 个答案:

答案 0 :(得分:5)

这是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 ...])在vanilla语法中。

答案 1 :(得分:0)

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