[Haskell-cafe] Re: Comments on reading two ints off Bytestring

Isaac Dupree isaacdupree at charter.net
Mon Dec 24 13:18:29 EST 2007


Paulo J. Matos wrote:
> On Dec 23, 2007 12:44 PM, Isaac Dupree <isaacdupree at charter.net> 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


More information about the Haskell-Cafe mailing list