Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Control.Applicative often simplifies parsers and this is no exception. Use the
applicative <$> and <*> to run the 'getErl' function which simplifies its structure
and makes it more clear what is going on.
While here, destroy a couple of liftM's, now we have started to use applicatives.
Note that Applicatives sits "between" a functor and a monad. They allow for some monad-like operations (and all monads are applicatives, but not vice versa). Here, we can utilize the applicatives to invert the ordering and get a parser which looks more like Erlang binary pattern matching. Also, we avoid having to invent the names for what we parse because it is stuffed directly into the position of the algebraic data type.
Not tested at all, so please don't blindly eat it. It compiles however, and since this is Haskell, it must be correct (snicker). No, really, read through the code and verify I did not miss a putN/putn erroneous swap.