Paulo J. Matos wrote:
On Dec 23, 2007 12:44 PM, Isaac Dupree <[EMAIL PROTECTED]> wrote:
-- this should work too
parseHeader3 :: BS.ByteString -> Maybe (Int, Int)
--note accurate type signature, which helps us use Maybe failure-monad,
--although losing your separate error messages

Oh gee, I just noticed that my type sig is in fact not correct. How
come GHC doesn't complain?

well, it is correct for Haskell if you want program failure for parse failure... it's just not a _total_ function unless you use Maybe (which determines whether you can have the code that uses parseHeader decide what to do in the case of a failure)


parseHeader3 bs = do
   (x, rest) <- BS.readInt $ BS.dropWhile (not . isDigit) bs
   (y, _) <- BS.readInt $ BS.dropWhile (not . isDigit) rest
   return (x, y)

What happens then if the first BS.readInt return Nothing???

--or to be clearer without syntactic sugar, that is
parseHeader3 bs =
   (BS.readInt $ BS.dropWhile (not . isDigit) bs)
     >>= \(x, rest) ->
            (BS.readInt $ BS.dropWhile (not . isDigit) rest)
               >>= \(y, _) ->
                      return (x, y)

when the first one returns Nothing, the whole expression becomes Nothing without examining the later parts of computation (as Chaddaï said)

Isaac
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to