
Hello, I am developing a very simple programming language for didactic purposes. Expressions can be composed of different types, like Int, Bool, String etc... The AST is compiled to JavaScript and the result is shown in the browser. The code is more or less like this: {-# LANGUAGE GADTs #-} data Expr a where Int :: Int -> Expr Int Bool :: Bool -> Expr Bool Text :: String -> Expr String -- Int operations Add :: Expr Int -> Expr Int -> Expr Int -- Bool operations And :: Expr Bool -> Expr Bool -> Expr Bool -- etc. etc. -- converts to JavaScript compile :: Expr a -> String compile (Int n) = show n compile (Text t) = show t compile (Add x y) = compile x ++ "+" ++ compile y -- etc. etc. The compilation works perfectly, but I am stuck with the parser. Since I don't know the types in advance, I would like to parse the whole expression at once. If I do: exprParser :: Parsec String u (Expr a) exprParser = parens exprParser <|> (reserved "true" >> return (Bool True)) <|> (reserved "false" >> return (Bool False)) <|> (stringLiteral >>= return . Text) The compiler says: "Couldn't match type `Bool' with `[Char]'" Where am I wrong?