Здесь я пытаюсь оценить выражение в Haskell, используя определенные значения типа данных Exp
.Тип функции будет eval :: Exp -> Int
, а тип данных будет таким:
data Exp = Num Int
| Exp :+: Exp
| Exp :-: Exp
| Exp :*: Exp
| Exp :/: Exp
deriving (Show)
, и значения, которые я пытаюсь оценить, таковы:
4 + 5 * 6 , respecting correct precedences of the operators
4 + 5 + 6 , respecting, that + binds left-associative
(4 + 3) * (5 - 2)
4 + (4 / (2 - 2))
Пока эта логика работает нормальночто:
eval :: Exp -> Int
eval (Num a) = a
eval (a :+: b) = (eval a) + (eval b)
eval (a :-: b) = (eval a) - (eval b)
eval (a :*: b) = (eval a) * (eval b)
eval (a :/: b) = (eval a) `div` (eval b)
Когда я передаю это, я получаю 3
как вывод, который является правильным:
eval (Num 2 :+: Num 2 :-: Num 1)
output = 3
но я запутался, как он оценил вторую часть выражения, которая:-:
что я понял, единственный шаблон, соответствующий первой итерации, был eval (a :+: b) = (eval a) + (eval b)
, который возвращал 4
как вывод, как он переносит 4
на следующую итерацию для выполнения операции :-:
?
до этого япытался что-то вроде этого:
eval :: Exp -> Int
eval (Num a) = a
eval (<b>Num</b> a :+: <b>Num</b> b) = eval (<b>Num</b> a) + eval (<b>Num</b> b)
eval (<b>Num</b> a :-: <b>Num</b> b) = eval (<b>Num</b> a) - eval (<b>Num</b> b)
eval (<b>Num</b> a :*: <b>Num</b> b) = eval (<b>Num</b> a) * eval (<b>Num</b> b)
eval (<b>Num</b> a :/: <b>Num</b> b) = eval (<b>Num</b> a) `div` eval (<b>Num</b> b)
он не дал желаемых результатов, а затем я просто изменил его на первую версию.это работало хорошо, но не получило надлежащей семантики этого.Любая помощь?Пожалуйста, не стесняйтесь вдаваться в детали.Заранее спасибо.