OCaml"with"具有模式匹配的保护功能

emi*_*tti 4 ocaml functional-programming pattern-matching pattern-guards

我在code.google.com上阅读了关于模式保护的内容,其中显示了这种类型的警卫:

match x with
| pat with g = y -> z
| ...
| pat with g = y -> z
Run Code Online (Sandbox Code Playgroud)

然而,在OCaml 4.02中,似乎没有工作(Syntax error: pattern expected.),所以问题是:在模式匹配中有一种解决方法可以实现这种绑定吗?我想写那样的东西

match something with
| value with y = f x when y > 0 -> value + y
Run Code Online (Sandbox Code Playgroud)

在此先感谢,欢呼.

cam*_*ter 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
Run Code Online (Sandbox Code Playgroud)

它看起来比"模式"更丑,但在PPX中我们必须在vanilla语法中使用一些属性和扩展名[%guard ...].