4 ms·
It's not bad, but the "0x" is part of the conversion into an integer, not part of the parsed address. That is, the more-complicated-looking combinator converts
by drostie 14y ago
It's not bad, but the "0x" is part of the conversion into an integer, not part of the parsed address. That is, the more-complicated-looking combinator converts the string "03-c0" to `Address 3 192`, while it looks like yours converts the string "0x03-0xc0" to to `Address "0x03" "0xc0"`. (I'm not totally sure about that; I'm still very new to Haskell. Thanks for the heads-up on attoparsec though.)
- tmhedberg 14y agoThe (* >) operator [1] (the space in the middle is just to circumvent HN's rather dumb comment formatting) sequences its two arguments, ignoring the one on the left. So string "0x" *> takeWhile1 hexadecimal parses a literal string "0x", then one or more hexadecimal digits, and the result is just the hexadecimal digits. [1] http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Applicative.html#v:-42--62- http://hackage.haskell.org/packages/archive/base/latest/doc/...
- dan00 14y ago{-# LANGUAGE OverloadedStrings #-} import Control.Applicative import qualified Data.Attoparsec.Text as P import qualified Data.Text as T data Address = Address {start :: Int, end :: Int} deriving Show address = Address <$> hexDigits <*> (dash *> hexDigits) where hexDigits = P.string "0x" *> P.hexadecimal dash = P.char '-' parse parser str = P.feed (P.parse parser $ T.pack str) T.empty Put the above into a file like 'parse.hs'. ~> ghci parse.hs *Main> parse address "0x1-0x1" Done "" Address {start = 1, end = 1} You might need to install attoparsec beforehand: cabal install attoparsec