[Haskell-beginners] Parsing

mike h mike_k_houghton at yahoo.co.uk
Fri Apr 14 18:02:37 UTC 2017

I have 
data PackageDec = Pkg String deriving Show

and a parser for it

packageP :: Parser PackageDec
packageP = do 
    literal “package" 
    x  <- identifier
    xs <- many ((:) <$> char '.' <*> identifier)
    return $ Pkg . concat $ (x:xs) 

so I’m parsing for this sort  of string 
“package some.sort.of.name”

and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have

packageP' :: Parser PackageDec
packageP' = literal "package" >>  Pkg . concat <$> many ((:) <$> char '.' <*> identifier)

but I can’t see how to get the ‘first’ identifier into this sequence - i.e. the bit that corresponds to  x <- identifier	in the 
monadic version.

in ghci
λ-> :t many ((:) <$> char '.' <*> identifier)
many ((:) <$> char '.' <*> identifier) :: Parser [[Char]]

so I think that somehow I need to get the ‘first’ identifier into a list just after  Pkg . concat  so that the whole list gets flattened and everybody is happy! 

Any help appreciated.


More information about the Beginners mailing list