-- 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
parseHeader3 bs = do
  (x, rest) <- BS.readInt $ BS.dropWhile (not . isDigit) bs
  (y, _) <- BS.readInt $ BS.dropWhile (not . isDigit) rest
  return (x, y)
--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)

Isaac


Paulo J. Matos wrote:
On Dec 23, 2007 12:32 PM, Paulo J. Matos <[EMAIL PROTECTED]> wrote:
Hello all,

It is either too difficult to get two integers of a bytestring, in
which case something should be done to ease the process or I should
learn much more Haskell. I guess the latter is the correct guess.

I have a bytestring containing two naturals. I was to get them as
efficiently as possible. Here's my code:

Just tried a better one, what do you think of this:
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)

parseHeader :: BS.ByteString -> (Int, Int)
parseHeader bs =
        let first = BS.readInt $ BS.dropWhile (not . isDigit) bs
        in
          if(isNothing first)
          then
              error "Couldn't find first natural."
          else
              let second = BS.readInt $ BS.dropWhile (not . isDigit) $
snd $ fromJust first
              in
                if(isNothing second)
                then
                    error "Couldn't find second natural."
                else
                    (fst $ fromJust first, fst $ fromJust second)

This seems to work:
parseHeader $ BS.pack "hello 252 359"
(252,359)

Is there a better way?

Cheers,

--
Paulo Jorge Matos - pocm at soton.ac.uk
http://www.personal.soton.ac.uk/pocm
PhD Student @ ECS
University of Southampton, UK





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

Reply via email to