<div dir="ltr"><div>The problem is your show instance.<br><br>show x' = show x', means that when x' is a FullState, it shows it, which causes an infinite loop.<br><br></div>You need to take out the default case and add something for FullState.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 25, 2015 at 11:37 AM, Adam Flott <span dir="ltr"><<a href="mailto:adam@adamflott.com" target="_blank">adam@adamflott.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm having trouble understanding why my simple parser never terminates when<br>
specific input is used.<br>
<br>
For example, let's say the first column is a field which can be in one of 4<br>
states, empty, omitted, other, and any arbitrary value. That is,<br>
<br>
    data FieldState a = EmptyState | OmittedState | OtherState | FullState a<br>
      deriving (Eq, Ord)<br>
<br>
When attempting to use,<br>
<br>
    $ echo "- " | ./parser<br>
    "- \n"<br>
    empty ('-')<br>
    $ echo "^ " | ./parser<br>
    "^ \n"<br>
    omitted ('^')<br>
    $ echo "~ " | ./parser<br>
    "~ \n"<br>
    other ('~')<br>
    [ all of this is as expected ]<br>
    $ echo "1 " | ./parser<br>
    "1 \n"<br>
    [ computer twiddles it's thumbs here until I manually terminate it ... ]<br>
    ^C^C<br>
    $<br>
<br>
Does anyone know what's happening and now to alleviate it?<br>
<br>
<br>
-- begin full code --<br>
<br>
-- base<br>
import Control.Applicative<br>
import Data.Word<br>
<br>
-- Hackage<br>
import qualified Data.Text.Lazy as TL<br>
import qualified <a href="http://Data.Text.Lazy.IO" target="_blank">Data.Text.Lazy.IO</a> as TLIO<br>
import Text.Parsec (parse)<br>
import Text.Parsec.Text.Lazy (Parser)<br>
import Text.Parser.Combinators<br>
import Text.Parser.Char<br>
<br>
data FieldState a = EmptyState | OmittedState | OtherState | FullState a<br>
  deriving (Eq, Ord)<br>
<br>
instance Functor FieldState where<br>
    fmap f (FullState a)    = FullState (f a)<br>
    fmap _ EmptyState       = EmptyState<br>
    fmap _ OmittedState     = OmittedState<br>
    fmap _ OtherState       = OtherState<br>
<br>
instance Applicative FieldState where<br>
    pure = FullState<br>
    (FullState f) <*> (FullState x) = FullState (f x)<br>
    _             <*> _             = EmptyState<br>
<br>
instance Monad FieldState where<br>
    (FullState x) >>= k = k x<br>
    EmptyState    >>= _ = EmptyState<br>
    OmittedState  >>= _ = OmittedState<br>
    OtherState    >>= _ = OtherState<br>
<br>
    (FullState _) >> k = k<br>
    EmptyState    >> _ = EmptyState<br>
    OmittedState  >> _ = OmittedState<br>
    OtherState    >> _ = OtherState<br>
<br>
    return  = FullState<br>
    fail _  = EmptyState<br>
<br>
instance Show (FieldState x) where<br>
    show (EmptyState)   = "empty ('-')"<br>
    show (OmittedState) = "omitted ('^')"<br>
    show (OtherState)   = "other ('~')"<br>
    show x' = show x'<br>
<br>
data Counter = Counter Word64 deriving (Eq, Ord, Show)<br>
<br>
parseNum :: (Num a) => Parser a<br>
parseNum = do<br>
    n <- rd <$> many digit<br>
    return $ fromIntegral n<br>
    where rd = read :: String -> Integer<br>
<br>
parseCounter :: Parser Counter<br>
parseCounter = Counter <$> parseNum<br>
<br>
parseFieldStateOff :: Parser Char<br>
parseFieldStateOff = char '-'<br>
<br>
parseFieldStateOmitted :: Parser Char<br>
parseFieldStateOmitted = char '^'<br>
<br>
parseFieldStateOther :: Parser Char<br>
parseFieldStateOther = char '~'<br>
<br>
parseFieldState :: Parser a -> Parser (FieldState a)<br>
parseFieldState p = (parseFieldStateOff >> return EmptyState)<br>
                  <|> (parseFieldStateOmitted >> return OmittedState)<br>
                  <|> (parseFieldStateOther >> return OtherState)<br>
                  <|> (p >>= return . FullState)<br>
<br>
main :: IO ()<br>
main = do<br>
    ls <- TLIO.getContents<br>
    print ls<br>
    mapM_ processLine (TL.lines ls)<br>
<br>
processLine :: TL.Text -> IO ()<br>
processLine line = case (parse (parseFieldState parseCounter) "" line) of<br>
  Left err -> print err<br>
  Right xs -> print xs<br>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br></div>