Hi Francesco,
Yes, I think you are right with "Are you sure you are not wanting [String] instead of String?”

I could use Parsec but I’m building up a parser library from first principles i.e.

newtype Parser a = P (String -> [(a,String)])

parse :: Parser a -> String -> [(a,String)]
parse (P p)  = p

and so on…. 

It’s just an exercise to see how far I can get. And its good fun. So maybe I need add another combinator or to what I already have. 

Thanks

Mike


On 14 Apr 2017, at 19:35, Francesco Ariis <fa-ml@ariis.it> wrote:

On Fri, Apr 14, 2017 at 07:02:37PM +0100, mike h wrote:
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

Hello Mike,

   I am not really sure what you are doing here? You are parsing a dot
separated list (like.this.one) but at the end you are concatenating all
together, why?
Are you sure you are not wanting [String] instead of String?

If so, Parsec comes with some handy parser combinators [1], maybe one of
them could fit your bill:

   -- should work
   packageP = literal "package" *> Pkg <$> sepEndBy1 identifier (char '.')

[1] https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec-Combinator.html
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners