[Haskell-beginners] Parsing

mike h mike_k_houghton at yahoo.co.uk
Fri Apr 14 19:53:47 UTC 2017


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 <toad3k at gmail.com> 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 <mike_k_houghton at yahoo.co.uk> 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 <fa-ml at 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
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>> 
>> 
>> 
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>> 
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



More information about the Beginners mailing list