On Dec 23, 2007, at 7:35 , Paulo J. Matos wrote:

parseHeader2 :: BS.ByteString -> (Int, Int)
    parseHeader2 bs =
        case (BS.readInt $ BS.dropWhile (not . isDigit) bs) of
          Nothing -> error "Couldn't find first natural."
          Just (x, rest) ->
              case (BS.readInt $ BS.dropWhile (not . isDigit) rest) of
                Nothing -> error "Couldn't find second natural."
                Just (y, _) -> (x, y)

-- simple version, factor out common code
parseHeader3 bs = let (x1,bs') = parse' bs  "first"
                      (x2,_  ) = parse' bs' "second"
                   in (x1,x2)
  where
    parse' s es = case BS.readInt $ BS.dropWhile (not . isDigit) s of
Nothing -> error $ "Couldn't find " ++ es ++ " natural."
                    Just r  -> r

-- this one uses MonadError; result is Either String (Int,Int)
parseHeader4 bs = do
    (x1,bs') <- parse'' bs  "first"
    (x2,_  ) <- parse'' bs' "second"
    return (x1,x2)
  where
    parse'' s es = case BS.readInt $ BS.dropWhile (not . isDigit) s of
Nothing -> fail $ "Couldn't find " ++ es ++ " natural."
                     Just r  -> return r

--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] [EMAIL PROTECTED]
system administrator [openafs,heimdal,too many hats] [EMAIL PROTECTED]
electrical and computer engineering, carnegie mellon university    KF8NH


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to