I’m glad to announce the initial release of ppx_viewpattern – transformation for view patterns in OCaml.
It attempts to imitate Haskell view patterns. I wrote this ppx rewriter mostly out of curiosity, rather than need, but it turned out neat enough that others might find it interesting or even useful.
Syntax
Use [%view? pat when exp]
as a pattern to apply exp
to whatever the pattern is matching and match the result of the exp
application against pat
.
This is analogous to the Haskell view pattern exp -> pat
.
The above extension node payload syntax is the best I could come up with to combine an expression and a pattern. Honestly, I was even surprised that when exp
is attached to a pattern in the AST (not a case), because normally it isn’t part of the pattern itself.
Example
This allows one to write
(* These cases are exactly like reduction rules! *)
let rec reduce = function
| Add (Int n1, Int n2) -> Some (Int (n1 + n2))
| Add ([%view? Some p1' when reduce], p2) -> Some (Add (p1', p2))
| Add (p1, [%view? Some p2' when reduce]) -> Some (Add (p1, p2'))
(* ... *)
| _ -> None
instead of
(* These nested cases are so annoying! *)
let rec reduce = function
| Add (Int n1, Int n2) -> Some (Int (n1 + n2))
| Add (p1, p2) ->
begin match reduce p1 with
| Some p1' -> Some (Add (p1', p2))
| None ->
begin match reduce p2 with
| Some p2' -> Some (Add (p1, p2'))
| None -> None
end
end
(* ... *)
| _ -> None
See examples/
on GitHub for more.