BTW you probably want 'data Color = Color !Word8 !Word8 !Word8'

On Fri, Sep 23, 2011 at 8:21 PM, Evan Laforge <qdun...@gmail.com> wrote:
> On Fri, Sep 23, 2011 at 8:04 PM, Michael Craig <mks...@gmail.com> wrote:
>> Suppose we want to parse a 24-bit hex color value:
>> input :: ByteString
>> input = "af093c blah blah blah"
>> type Color = (Word8, Word8, Word8)
>>
>> Attoparsec.Char8 exports a nice hexadecimal parser, but it consumes all
>> available hex-flavored input. I'd like to make it consume exactly two bytes,
>> so I could write my color parser like this:
>>
>> color :: Parser Color
>> color = do
>>     r <- hex2
>>     g <- hex2
>>     b <- hex2
>>     return $ Color (r, g, b)
>> hex2 :: Parser Word8
>> hex2 = ???
>>
>> So my question is "how do I write hex2?" I could easily rewrite hexadecimal,
>> but it would be nicer to reuse its hex-handling logic.
>
> If it's easy enough to write inline, might as well do so.  And it's
> fun with Applicative :)
>
> hex2 = (+) <$> ((*16) <$> higit) <*> higit
> higit = subtract (fromEnum '0') <$> satisfy isHexDigit
> color = Color <$> hex2 <*> hex2 <*> hex2
>

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

Reply via email to