Send Beginners mailing list submissions to
[email protected]
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
[email protected]
You can reach the person managing the list at
[email protected]
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 <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
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 <[email protected]> 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 <[email protected]> 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
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
------------------------------
Message: 2
Date: Fri, 14 Apr 2017 20:53:47 +0100
From: mike h <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Parsing
Message-ID: <[email protected]>
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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 106, Issue 8
*****************************************