OCaml "с" охранником в сопоставлении с образцом
Я прочитал о шаблонных охранниках на 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 ответа
Это OCaml "шаблоны" расширение синтаксиса CamlP4. Сам по себе OCaml не имеет шаблонных средств защиты, и это расширение p4 предоставило его в качестве расширений синтаксиса, которые должны отлаживаться препроцессором CamlP4 перед передачей в компилятор OCaml.
К сожалению, "шаблоны" не были перенесены в 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 ...]
,
Эта страница о ocaml-patterns
функция, которая никогда не была объединена с компилятором. В настоящее время у OCaml нет активных шаблонов.