
Hi, Fairly new to Haskell and trying some parsec. (Also, new to parsers/interpreters) I had come up with this, which works, but I can't help thinking there's a better way :) |> newtype Identifier = Identifier String
newtype Literal = StringLiteral String -- to be extended later data Primary = PrimaryLiteral Literal | PrimaryIdentifier Identifier
||> primary = do {
i <- identifier; return $ PrimaryIdentifier i; } <|> do { l <- stringLiteral; return $ PrimaryLiteral l; }
||> identifier = do
i <- many1 letter return $ Identifier i
stringLiteral = do (char '\'') s <- manyTill anyChar (char '\'') return $ StringLiteral s
Is there a way through combining types/parsers that the double do block in primary could be avoided? I understand it's necessary right now because the parsers identifier and stringLiteral return different types, so I can't just write:
i <- identifier <|> stringLiteral
So, I'm not sure whether my types need work, the parsers, or if this is the simplest way. Thanks, Levi lstephen.wordpress.com PS, have lurked on the list for a while, enjoy the discussions and content. |