<div dir="ltr"><div class="gmail_default" style="font-family:times new roman,serif">Hi List,<br><br>There is my first email on haskell-cafe, I must admit haskell is a amazing language even though I found it hard to program.<br>
<br></div><div class="gmail_default" style="font-family:times new roman,serif">I'm trying to use Parsec to parse a text file something like:<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">
format 1)<br></div><div class="gmail_default" style="font-family:times new roman,serif">HEADER<br></div><div class="gmail_default" style="font-family:times new roman,serif">BODY<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">
format 2)<br></div><div class="gmail_default" style="font-family:times new roman,serif">BODY<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">BODY = many DATA_FIELDS<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">
I must distinguish the format is either 1) or 2), because I need process them differently. So I'm trying to use lookAhead & <|>, something like:<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">
format1Header = do<br></div><div class="gmail_default" style="font-family:times new roman,serif">Â HEADER_parser1<br></div><div class="gmail_default" style="font-family:times new roman,serif">Â HEADER_parser2<br></div><div class="gmail_default" style="font-family:times new roman,serif">
 return ..<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">format2Header = do<br></div><div class="gmail_default" style="font-family:times new roman,serif"> -- whatever<br></div><div class="gmail_default" style="font-family:times new roman,serif">
 return ..<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">headerVersion = do<br></div><div class="gmail_default" style="font-family:times new roman,serif"> version <- (lookAhead format1Header) <|> (lookAhead format2Header)<br>
</div><div class="gmail_default" style="font-family:times new roman,serif">Â return version<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">Howerver if format1Header parser failed headerVersion just return failure without trying format2Header parser.<br>
<br></div><div class="gmail_default" style="font-family:times new roman,serif">Full source code is attached, you can load the source then just run ``main''<br><br></div><div class="gmail_default" style="font-family:times new roman,serif">
I searched seems similar issue had been reported:<br><a href="https://groups.google.com/forum/#!topic/fa.haskell/NGjQqR05-TA">https://groups.google.com/forum/#!topic/fa.haskell/NGjQqR05-TA</a><br></div><div class="gmail_default" style="font-family:times new roman,serif">
<br></div><div class="gmail_default" style="font-family:times new roman,serif">Is there anything I'm fundamentally wrong with lookAhead and <|> in Parsec? How can I get headerVersion works as expected?<br><br></div>
<div class="gmail_default" style="font-family:times new roman,serif">Thank you<br>Baojun<br></div></div>