The code looks good. One thing you might want to consider is using applicative style for parsing. So<p><pre><code>  taggedImage :: Parser BaseImage
  taggedImage = do
    name &lt;- many (noneOf &quot;:&quot;)
    reservedOp &quot;:&quot;
    tag &lt;- many (noneOf &quot;\n&quot;)
    return $ TaggedImage name tag
</code></pre>
Would end up something like:<p><pre><code>  taggedImage :: Parser BaseImage
  taggedImage = TaggedImage &lt;$&gt; (many (noneOf &quot;\n&quot;) &lt;* reservedOp &quot;:&quot;)
                            &lt;*&gt; (many (noneOf &quot;\n&quot;)</code></pre>