[Haskell-beginners] Parsing

David McBride toad3k at gmail.com
Fri Apr 14 19:27:16 UTC 2017


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
>


More information about the Beginners mailing list