By memoizing `self` and then `-compact`ing recursively, we terminate the computation without resorting to a least fixed point (which would require us to implement recursive equality on parser combinators).