Hello everybody, A small question. ----- packageP = do literal “package" ----- what is the "literal" in this code? My problem is $ ghc ParserTest.hs [1 of 1] Compiling ParserTest ( ParserTest.hs, ParserTest.o ) ParserTest.hs:11:5: Not in scope: ‘literal’ $ ghc --version The Glorious Glasgow Haskell Compilation System, version 7.10.3 Is this because I use old version of software? Thanks, Andrey 2017-04-14 21:58 GMT+03:00 <beginners-request@haskell.org>:
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-request@haskell.org
You can reach the person managing the list at beginners-owner@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_houghton@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-0D1DA19E0A2C@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 <toad3k@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-dNr8pDfRSZXg@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_houghton@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-ml@ariis.it> To: beginners@haskell.org Subject: Re: [Haskell-beginners] Parsing Message-ID: <20170414183532.GA4376@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_houghton@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-057A643EE1A8@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 <toad3k@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_houghton@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_houghton@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-B9EA8532D873@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-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 <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>