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 に答える