Oops, sorry, that should be: listChars2 :: ListT IO Char listChars2 = do c <- lift getChar if c == 'q' then return c else return c `mplus` listChars2