Поскольку выражения могут считывать и записывать в область хранения, ваша функция оценки должна получить состояние памяти в качестве параметра и вернуть новое состояние в результате.
evaluate :: Expr -> Int -> (Float, Int)
[где Int
- тип хранилища, а Float
- тип результата, конечно, вы можете изменить это].
При реализации evaluate (Sum a b)
необходимо передать память в evaluate a
, получить новое значение памяти и присвоить его evaluate b
.
|
| m
\ /
|----------| x
|evaluate a|--------|
|----------- |
| |
| m' |
\ / \ /
|----------| y ---
|evaluate b|----->| + |
|----------| ---
| |
| |
\ / \ /
final final
value of result
memory
Использовать сопоставление с образцом. Вы бы начали с let (x,m') = evaluate a m in ...
.