She’s got idiom brackets now. A parser example.
> import Parsley
> data Exp
> = V Char
> | Neg Exp
> | Exp :+: Exp
> deriving Show
> pExp :: P Char Exp
> pExp =
> (| Neg {teq '-'} pExp
> | {teq '('} pExp :+: {teq '+'} pExp {teq ')'}
> | V (tok isAlpha)
> |)
You can write a bunch of alternatives in (| .. | .. | .. |) each alternative is an application (possibly infix) whose function is taken as pure, and whose arguments are effectful. Additional noise, contributing effects but no values can be inserted with { .. ; .. }. I know, I’ve stolen record update syntax. Boo hoo.
More in a bit.
It’s been observed that spotting the main actor in {teq ‘(’} pExp :+: {teq ‘+’} pExp {teq ‘)’} is a mite tricky. It’s perhaps injudicious to mix too much noise with infix ops. In this case, (:+:) {teq ‘(’} pExp {teq ‘+’} pExp {teq ‘)’} might be a little clearer.