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
*****************************************

Reply via email to