data Expr = Var Char | Tall Int | Sum Expr Expr | Mult Expr Expr | Neg Expr | Let Expr Expr Expr
deriving(Eq, Show)
Это тип данных для Expr
, у меня есть несколько вопросов. Я предполагаю, что для анализа выражений, таких как *(Expr,Expr)
, как показано в определении типа данных. Однако у меня есть некоторые проблемы с «созданием» действительного Expr
. Я использую сопоставление с образцом для распознавания различных вещей, которыми может быть Expr. Еще немного кода:
parseExpr :: String -> (Expr, String)
parseExpr ('*':'(':x:',':y:')':s) = (Mult (parseExpr [x] parseExpr [y]),s)
Это не работает, очевидно. Тип возврата parseExpr
должен возвращать остаток выражения, которое должно быть проанализировано, в части проанализированного кода как Expr
. Правая сторона этого кода является проблемой. Я не могу сделать действительный Expr
. Предполагается, что функция рекурсивно вызывает себя, пока проблема не будет решена.
ДРУГАЯ проблема в том, что я не знаю, как выполнить сопоставление с шаблоном Var
и Tall
. Как я могу проверить, что Var
является заглавным символом между A-Z и что Tall
равен 0-9, и вернуть его как действительный Expr
?
Обычно я могу просто посмотреть на несколько частей строки, чтобы понять, с какой частью Expr
я имею дело.
Input like: parseProg "let X be 9 in *(X , 2)" Would spit out: Let (Var 'X') (Tall 9) (Mult (Var 'X') (Tall 2))