<div dir="ltr"><div>Hello everybody,<br><br></div>A small question.<br><div>-----<br>packageP = do<br>
    literal “package"<br>-----<br><br></div><div>what is the "literal" in this code? My problem is<br><br>$ ghc ParserTest.hs <br>[1 of 1] Compiling ParserTest       ( ParserTest.hs, ParserTest.o )<br><br>ParserTest.hs:11:5: Not in scope: ‘literal’<br><br></div><div>$ ghc --version<br>The Glorious Glasgow Haskell Compilation System, version 7.10.3<br><br></div><div>Is this because I use old version of software?<br><br></div><div>Thanks,<br></div><div>Andrey<br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-04-14 21:58 GMT+03:00  <span dir="ltr"><<a href="mailto:beginners-request@haskell.org" target="_blank">beginners-request@haskell.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send Beginners mailing list submissions to<br>
        <a href="mailto:beginners@haskell.org">beginners@haskell.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:beginners-request@haskell.org">beginners-request@haskell.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:beginners-owner@haskell.org">beginners-owner@haskell.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of Beginners digest..."<br>
<br>
<br>
Today's Topics:<br>
<br>
   1.  Parsing (mike h)<br>
   2. Re:  Parsing (David McBride)<br>
   3. Re:  Parsing (Francesco Ariis)<br>
   4. Re:  Parsing (mike h)<br>
   5. Re:  Parsing (mike h)<br>
<br>
<br>
------------------------------<wbr>------------------------------<wbr>----------<br>
<br>
Message: 1<br>
Date: Fri, 14 Apr 2017 19:02:37 +0100<br>
From: mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>><br>
To: The Haskell-Beginners Mailing List - Discussion of primarily<br>
        beginner-level topics related to Haskell <<a href="mailto:beginners@haskell.org">beginners@haskell.org</a>><br>
Subject: [Haskell-beginners] Parsing<br>
Message-ID: <<a href="mailto:2C66C9DC-30AF-41C5-B9AF-0D1DA19E0A2C@yahoo.co.uk">2C66C9DC-30AF-41C5-B9AF-<wbr>0D1DA19E0A2C@yahoo.co.uk</a>><br>
Content-Type: text/plain; charset=utf-8<br>
<br>
I have<br>
data PackageDec = Pkg String deriving Show<br>
<br>
and a parser for it<br>
<br>
packageP :: Parser PackageDec<br>
packageP = do<br>
    literal “package"<br>
    x  <- identifier<br>
    xs <- many ((:) <$> char '.' <*> identifier)<br>
    return $ Pkg . concat $ (x:xs)<br>
<br>
so I’m parsing for this sort  of string<br>
“package <a href="http://some.sort.of.name" rel="noreferrer" target="_blank">some.sort.of.name</a>”<br>
<br>
and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have<br>
<br>
packageP' :: Parser PackageDec<br>
packageP' = literal "package" >>  Pkg . concat <$> many ((:) <$> char '.' <*> identifier)<br>
<br>
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<br>
monadic version.<br>
<br>
in ghci<br>
λ-> :t many ((:) <$> char '.' <*> identifier)<br>
many ((:) <$> char '.' <*> identifier) :: Parser [[Char]]<br>
<br>
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!<br>
<br>
Any help appreciated.<br>
<br>
Thanks<br>
Mike<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Fri, 14 Apr 2017 14:17:42 -0400<br>
From: David McBride <<a href="mailto:toad3k@gmail.com">toad3k@gmail.com</a>><br>
To: The Haskell-Beginners Mailing List - Discussion of primarily<br>
        beginner-level topics related to Haskell <<a href="mailto:beginners@haskell.org">beginners@haskell.org</a>><br>
Subject: Re: [Haskell-beginners] Parsing<br>
Message-ID:<br>
        <<a href="mailto:CAN%2BTr42ifDF62sXo6WDq32rBAPHQ%2BeqTkJeuk-dNr8pDfRSZXg@mail.gmail.com">CAN+<wbr>Tr42ifDF62sXo6WDq32rBAPHQ+<wbr>eqTkJeuk-dNr8pDfRSZXg@mail.<wbr>gmail.com</a>><br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
Try breaking it up into pieces.  There a literal "package" which is<br>
dropped.  There is a first identifier, then there are the rest of the<br>
identifiers (a list), then those two things are combined somehow (with<br>
:).<br>
<br>
literal "package" *> (:) <$> identifier <*> restOfIdentifiers<br>
where<br>
  restOfIdentifiers :: Applicative f => f [String]<br>
  restOfIdentifiers = many ((:) <$> char '.' <*> identifier<br>
<br>
I have not tested this code, but it should be close to what you are looking for.<br>
<br>
On Fri, Apr 14, 2017 at 2:02 PM, mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>> wrote:<br>
> I have<br>
> data PackageDec = Pkg String deriving Show<br>
><br>
> and a parser for it<br>
><br>
> packageP :: Parser PackageDec<br>
> packageP = do<br>
>     literal “package"<br>
>     x  <- identifier<br>
>     xs <- many ((:) <$> char '.' <*> identifier)<br>
>     return $ Pkg . concat $ (x:xs)<br>
><br>
> so I’m parsing for this sort  of string<br>
> “package <a href="http://some.sort.of.name" rel="noreferrer" target="_blank">some.sort.of.name</a>”<br>
><br>
> and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have<br>
><br>
> packageP' :: Parser PackageDec<br>
> packageP' = literal "package" >>  Pkg . concat <$> many ((:) <$> char '.' <*> identifier)<br>
><br>
> 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<br>
> monadic version.<br>
><br>
> in ghci<br>
> λ-> :t many ((:) <$> char '.' <*> identifier)<br>
> many ((:) <$> char '.' <*> identifier) :: Parser [[Char]]<br>
><br>
> 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!<br>
><br>
> Any help appreciated.<br>
><br>
> Thanks<br>
> Mike<br>
><br>
><br>
><br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Fri, 14 Apr 2017 20:35:32 +0200<br>
From: Francesco Ariis <<a href="mailto:fa-ml@ariis.it">fa-ml@ariis.it</a>><br>
To: <a href="mailto:beginners@haskell.org">beginners@haskell.org</a><br>
Subject: Re: [Haskell-beginners] Parsing<br>
Message-ID: <20170414183532.GA4376@casa.<wbr>casa><br>
Content-Type: text/plain; charset=utf-8<br>
<br>
On Fri, Apr 14, 2017 at 07:02:37PM +0100, mike h wrote:<br>
> I have<br>
> data PackageDec = Pkg String deriving Show<br>
><br>
> and a parser for it<br>
><br>
> packageP :: Parser PackageDec<br>
> packageP = do<br>
>     literal “package"<br>
>     x  <- identifier<br>
>     xs <- many ((:) <$> char '.' <*> identifier)<br>
>     return $ Pkg . concat $ (x:xs)<br>
><br>
> so I’m parsing for this sort  of string<br>
> “package <a href="http://some.sort.of.name" rel="noreferrer" target="_blank">some.sort.of.name</a>”<br>
><br>
> and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have<br>
<br>
Hello Mike,<br>
<br>
    I am not really sure what you are doing here? You are parsing a dot<br>
separated list (like.this.one) but at the end you are concatenating all<br>
together, why?<br>
Are you sure you are not wanting [String] instead of String?<br>
<br>
If so, Parsec comes with some handy parser combinators [1], maybe one of<br>
them could fit your bill:<br>
<br>
    -- should work<br>
    packageP = literal "package" *> Pkg <$> sepEndBy1 identifier (char '.')<br>
<br>
[1] <a href="https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec-Combinator.html" rel="noreferrer" target="_blank">https://hackage.haskell.org/<wbr>package/parsec-3.1.11/docs/<wbr>Text-Parsec-Combinator.html</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 4<br>
Date: Fri, 14 Apr 2017 20:12:14 +0100<br>
From: mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>><br>
To: The Haskell-Beginners Mailing List - Discussion of primarily<br>
        beginner-level topics related to Haskell <<a href="mailto:beginners@haskell.org">beginners@haskell.org</a>><br>
Subject: Re: [Haskell-beginners] Parsing<br>
Message-ID: <<a href="mailto:FF162CDE-E7E8-421B-A92E-057A643EE1A8@yahoo.co.uk">FF162CDE-E7E8-421B-A92E-<wbr>057A643EE1A8@yahoo.co.uk</a>><br>
Content-Type: text/plain; charset=utf-8<br>
<br>
Hi David,<br>
<br>
Thanks but I tried something like that before I posted. I’ll try again maybe I mistyped.<br>
<br>
Mike<br>
> On 14 Apr 2017, at 19:17, David McBride <<a href="mailto:toad3k@gmail.com">toad3k@gmail.com</a>> wrote:<br>
><br>
> Try breaking it up into pieces.  There a literal "package" which is<br>
> dropped.  There is a first identifier, then there are the rest of the<br>
> identifiers (a list), then those two things are combined somehow (with<br>
> :).<br>
><br>
> literal "package" *> (:) <$> identifier <*> restOfIdentifiers<br>
> where<br>
>  restOfIdentifiers :: Applicative f => f [String]<br>
>  restOfIdentifiers = many ((:) <$> char '.' <*> identifier<br>
><br>
> I have not tested this code, but it should be close to what you are looking for.<br>
><br>
> On Fri, Apr 14, 2017 at 2:02 PM, mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>> wrote:<br>
>> I have<br>
>> data PackageDec = Pkg String deriving Show<br>
>><br>
>> and a parser for it<br>
>><br>
>> packageP :: Parser PackageDec<br>
>> packageP = do<br>
>>    literal “package"<br>
>>    x  <- identifier<br>
>>    xs <- many ((:) <$> char '.' <*> identifier)<br>
>>    return $ Pkg . concat $ (x:xs)<br>
>><br>
>> so I’m parsing for this sort  of string<br>
>> “package <a href="http://some.sort.of.name" rel="noreferrer" target="_blank">some.sort.of.name</a>”<br>
>><br>
>> and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have<br>
>><br>
>> packageP' :: Parser PackageDec<br>
>> packageP' = literal "package" >>  Pkg . concat <$> many ((:) <$> char '.' <*> identifier)<br>
>><br>
>> 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<br>
>> monadic version.<br>
>><br>
>> in ghci<br>
>> λ-> :t many ((:) <$> char '.' <*> identifier)<br>
>> many ((:) <$> char '.' <*> identifier) :: Parser [[Char]]<br>
>><br>
>> 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!<br>
>><br>
>> Any help appreciated.<br>
>><br>
>> Thanks<br>
>> Mike<br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> ______________________________<wbr>_________________<br>
>> Beginners mailing list<br>
>> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
> ______________________________<wbr>_________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 5<br>
Date: Fri, 14 Apr 2017 20:19:40 +0100<br>
From: mike h <<a href="mailto:mike_k_houghton@yahoo.co.uk">mike_k_houghton@yahoo.co.uk</a>><br>
To: The Haskell-Beginners Mailing List - Discussion of primarily<br>
        beginner-level topics related to Haskell <<a href="mailto:beginners@haskell.org">beginners@haskell.org</a>><br>
Subject: Re: [Haskell-beginners] Parsing<br>
Message-ID: <<a href="mailto:D208C2B2-6E38-427D-9EAF-B9EA8532D873@yahoo.co.uk">D208C2B2-6E38-427D-9EAF-<wbr>B9EA8532D873@yahoo.co.uk</a>><br>
Content-Type: text/plain; charset="utf-8"<br>
<br>
Hi Francesco,<br>
Yes, I think you are right with "Are you sure you are not wanting [String] instead of String?”<br>
<br>
I could use Parsec but I’m building up a parser library from first principles i.e.<br>
<br>
newtype Parser a = P (String -> [(a,String)])<br>
<br>
parse :: Parser a -> String -> [(a,String)]<br>
parse (P p)  = p<br>
<br>
and so on….<br>
<br>
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.<br>
<br>
Thanks<br>
<br>
Mike<br>
<br>
<br>
> On 14 Apr 2017, at 19:35, Francesco Ariis <<a href="mailto:fa-ml@ariis.it">fa-ml@ariis.it</a>> wrote:<br>
><br>
> On Fri, Apr 14, 2017 at 07:02:37PM +0100, mike h wrote:<br>
>> I have<br>
>> data PackageDec = Pkg String deriving Show<br>
>><br>
>> and a parser for it<br>
>><br>
>> packageP :: Parser PackageDec<br>
>> packageP = do<br>
>>    literal “package"<br>
>>    x  <- identifier<br>
>>    xs <- many ((:) <$> char '.' <*> identifier)<br>
>>    return $ Pkg . concat $ (x:xs)<br>
>><br>
>> so I’m parsing for this sort  of string<br>
>> “package <a href="http://some.sort.of.name" rel="noreferrer" target="_blank">some.sort.of.name</a>”<br>
>><br>
>> and I’m trying to rewrite the packageP parser in applicative style. As a not quite correct start I have<br>
><br>
> Hello Mike,<br>
><br>
>    I am not really sure what you are doing here? You are parsing a dot<br>
> separated list (like.this.one) but at the end you are concatenating all<br>
> together, why?<br>
> Are you sure you are not wanting [String] instead of String?<br>
><br>
> If so, Parsec comes with some handy parser combinators [1], maybe one of<br>
> them could fit your bill:<br>
><br>
>    -- should work<br>
>    packageP = literal "package" *> Pkg <$> sepEndBy1 identifier (char '.')<br>
><br>
> [1] <a href="https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec-Combinator.html" rel="noreferrer" target="_blank">https://hackage.haskell.org/<wbr>package/parsec-3.1.11/docs/<wbr>Text-Parsec-Combinator.html</a> <<a href="https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec-Combinator.html" rel="noreferrer" target="_blank">https://hackage.haskell.org/<wbr>package/parsec-3.1.11/docs/<wbr>Text-Parsec-Combinator.html</a>><br>
> ______________________________<wbr>_________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a> <mailto:<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a>><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a> <<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><wbr>><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://mail.haskell.org/pipermail/beginners/attachments/20170414/66a17133/attachment.html" rel="noreferrer" target="_blank">http://mail.haskell.org/<wbr>pipermail/beginners/<wbr>attachments/20170414/66a17133/<wbr>attachment.html</a>><br>
<br>
------------------------------<br>
<br>
Subject: Digest Footer<br>
<br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
<br>
<br>
------------------------------<br>
<br>
End of Beginners Digest, Vol 106, Issue 7<br>
******************************<wbr>***********<br>
</blockquote></div><br></div>