Здравствуйте, marttry, Вы писали:
M>Собственно, с самим калькулятором проблем нет — на любом ФЯП такое чудо пишется за 5 минут. Проблема возникла именно в том как эти результаты между вычислениями сохранять.
M>Какие есть варианты решения задачи?
Ну как, завести мап имён переменных на значения; ввести команды "записать переменную" и "прочитать переменную" вдобавок к имеющимся арифметическим.
Пара (стек,память) образуют состояние машины — это получается монада "состояние".
Поскольку калькулятор может засбоить (деление на ноль, чтение неизвестной переменной, исчерпание стека) — то надо скрестить с монадой Maybe.
Получится MaybeT (State ([Float], Map String Float))
где [Float] — это стек, Map String Float — таблица переменных...
Здравствуйте, marttry, Вы писали:
M>Какие есть варианты решения задачи?
В виде строки, в виде списка токенов или сразу после ввода разбирать во что-то типа
data Expr = Value Double
| Expr :+: Expr
| Expr :-: Expr
| Expr :*: Expr
-- | что там еще умеет калькулятор
Здравствуйте, deniok, Вы писали:
D>Здравствуйте, marttry, Вы писали:
M>>Какие есть варианты решения задачи?
D>В виде строки, в виде списка токенов или сразу после ввода разбирать во что-то типа
D>D>data Expr = Value Double
D> | Expr :+: Expr
D> | Expr :-: Expr
D> | Expr :*: Expr
D> -- | что там еще умеет калькулятор
D>
Решил примерно так:
перед передачей списка в функцию вычисляющую выражение проверяю в самом выражении наличие символа передачи в переменную (->) и если присвоение переменной имеет место, то разделяю выражение на "до" и "после", и сохраняю вычисленную переменную в список переменных.
Вопрос в другом — слишком ли это, хм.. идиотизм?