我在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
先谢谢,欢呼。
答案 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没有活动模式。