Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. Re: Parsing (David McBride) 2. Re: Parsing (mike h) ---------------------------------------------------------------------- Message: 1 Date: Fri, 14 Apr 2017 15:27:16 -0400 From: David McBride <toa...@gmail.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] Parsing Message-ID: <CAN+Tr42=lpkmxbaw_+kjtppthfixtdj+b_qafti4eko9vvw...@mail.gmail.com> Content-Type: text/plain; charset=UTF-8 Working it out for myself, it should be something like: blah :: forall f. Applicative f => f PackageDec blah = package *> Pkg . mconcat <$> ((:) <$> identifier <*> restOfIdentifiers) where restOfIdentifiers :: Applicative f => f [String] restOfIdentifiers = many ((:) <$> char '.' <*> identifier) On Fri, Apr 14, 2017 at 3:19 PM, mike h <mike_k_hough...@yahoo.co.uk> wrote: > 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...@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 > > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > ------------------------------ Message: 2 Date: Fri, 14 Apr 2017 20:53:47 +0100 From: mike h <mike_k_hough...@yahoo.co.uk> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] Parsing Message-ID: <dd2f6ec9-4ade-45a6-bb69-d75f0c1f2...@yahoo.co.uk> Content-Type: text/plain; charset=utf-8 Duh! I did have that - well clearly not exactly! What I’d done a couple of hours ago had the parens in the wrong place Earlier i had packageP' = literal "package" >> Pkg <$> (:) <$> identifier <*> many ((:) <$> char '.' <*> identifier) i.e. the first <$> (:) what I have now is (thanks David) packageP' = literal "package" >> Pkg <$> ((:) <$> identifier <*> many ((:) <$> char '.' <*> identifier)) :) Looking at it now what I first had is blindingly obviously wrong! Haskell often makes me feel stupid and makes me work for my code, thats why I love it! Cheers Mike > On 14 Apr 2017, at 20:27, David McBride <toa...@gmail.com> wrote: > > Working it out for myself, it should be something like: > > blah :: forall f. Applicative f => f PackageDec > blah = package *> Pkg . mconcat <$> ((:) <$> identifier <*> restOfIdentifiers) > where > restOfIdentifiers :: Applicative f => f [String] > restOfIdentifiers = many ((:) <$> char '.' <*> identifier) > > On Fri, Apr 14, 2017 at 3:19 PM, mike h <mike_k_hough...@yahoo.co.uk> wrote: >> 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...@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 >> >> >> >> _______________________________________________ >> Beginners mailing list >> Beginners@haskell.org >> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners >> > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 106, Issue 8 *****************************************