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. Parsing (mike h) 2. Re: Parsing (David McBride) 3. Re: Parsing (Francesco Ariis) 4. Re: Parsing (mike h) 5. Re: Parsing (mike h) ---------------------------------------------------------------------- Message: 1 Date: Fri, 14 Apr 2017 19:02:37 +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: [Haskell-beginners] Parsing Message-ID: <2c66c9dc-30af-41c5-b9af-0d1da19e0...@yahoo.co.uk> Content-Type: text/plain; charset=utf-8 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. Thanks Mike ------------------------------ Message: 2 Date: Fri, 14 Apr 2017 14:17:42 -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+tr42ifdf62sxo6wdq32rbaphq+eqtkjeuk-dnr8pdfrs...@mail.gmail.com> Content-Type: text/plain; charset=UTF-8 Try breaking it up into pieces. There a literal "package" which is dropped. There is a first identifier, then there are the rest of the identifiers (a list), then those two things are combined somehow (with :). literal "package" *> (:) <$> identifier <*> restOfIdentifiers where restOfIdentifiers :: Applicative f => f [String] restOfIdentifiers = many ((:) <$> char '.' <*> identifier I have not tested this code, but it should be close to what you are looking for. On Fri, Apr 14, 2017 at 2:02 PM, mike h <mike_k_hough...@yahoo.co.uk> 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 > > 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. > > Thanks > Mike > > > > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ Message: 3 Date: Fri, 14 Apr 2017 20:35:32 +0200 From: Francesco Ariis <fa...@ariis.it> To: beginners@haskell.org Subject: Re: [Haskell-beginners] Parsing Message-ID: <20170414183532.ga4...@casa.casa> Content-Type: text/plain; charset=utf-8 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 ------------------------------ Message: 4 Date: Fri, 14 Apr 2017 20:12:14 +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: <ff162cde-e7e8-421b-a92e-057a643ee...@yahoo.co.uk> Content-Type: text/plain; charset=utf-8 Hi David, Thanks but I tried something like that before I posted. I’ll try again maybe I mistyped. Mike > On 14 Apr 2017, at 19:17, David McBride <toa...@gmail.com> wrote: > > Try breaking it up into pieces. There a literal "package" which is > dropped. There is a first identifier, then there are the rest of the > identifiers (a list), then those two things are combined somehow (with > :). > > literal "package" *> (:) <$> identifier <*> restOfIdentifiers > where > restOfIdentifiers :: Applicative f => f [String] > restOfIdentifiers = many ((:) <$> char '.' <*> identifier > > I have not tested this code, but it should be close to what you are looking > for. > > On Fri, Apr 14, 2017 at 2:02 PM, mike h <mike_k_hough...@yahoo.co.uk> 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 >> >> 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. >> >> Thanks >> Mike >> >> >> >> >> >> _______________________________________________ >> 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: 5 Date: Fri, 14 Apr 2017 20:19:40 +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: <d208c2b2-6e38-427d-9eaf-b9ea8532d...@yahoo.co.uk> Content-Type: text/plain; charset="utf-8" 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 > > <https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec-Combinator.html> > _______________________________________________ > Beginners mailing list > Beginners@haskell.org <mailto:Beginners@haskell.org> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20170414/66a17133/attachment.html> ------------------------------ 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 7 *****************************************