[Haskell] Интерпретатор математических выражений
От: marttry  
Дата: 10.01.15 17:09
Оценка:
Доброго дня, форумчане
Стоит задача написать калькулятор на Haskell, да не простой, а что бы еще и некоторые вычисления мог в переменные складывать.
В придачу к этому выражения записываются в обратной польской записи.
Собственно, с самим калькулятором проблем нет — на любом ФЯП такое чудо пишется за 5 минут. Проблема возникла именно в том как эти результаты между вычислениями сохранять.
Какие есть варианты решения задачи?
haskell фп
Re: [Haskell] Интерпретатор математических выражений
От: deniok Россия  
Дата: 10.01.15 20:54
Оценка:
Здравствуйте, marttry, Вы писали:

M>Какие есть варианты решения задачи?


В виде строки, в виде списка токенов или сразу после ввода разбирать во что-то типа
data Expr = Value Double 
          | Expr :+: Expr 
          | Expr :-: Expr 
          | Expr :*: Expr 
       -- | что там еще умеет калькулятор
Re[2]: [Haskell] Интерпретатор математических выражений
От: marttry  
Дата: 10.01.15 21:24
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, marttry, Вы писали:


M>>Какие есть варианты решения задачи?


D>В виде строки, в виде списка токенов или сразу после ввода разбирать во что-то типа

D>
D>data Expr = Value Double 
D>          | Expr :+: Expr 
D>          | Expr :-: Expr 
D>          | Expr :*: Expr 
D>       -- | что там еще умеет калькулятор
D>


Решил примерно так:
перед передачей списка в функцию вычисляющую выражение проверяю в самом выражении наличие символа передачи в переменную (->) и если присвоение переменной имеет место, то разделяю выражение на "до" и "после", и сохраняю вычисленную переменную в список переменных.
Вопрос в другом — слишком ли это, хм.. идиотизм?
Re: [Haskell] Интерпретатор математических выражений
От: Кодт Россия  
Дата: 11.01.15 21:00
Оценка: +2
Здравствуйте, marttry, Вы писали:

M>Собственно, с самим калькулятором проблем нет — на любом ФЯП такое чудо пишется за 5 минут. Проблема возникла именно в том как эти результаты между вычислениями сохранять.

M>Какие есть варианты решения задачи?

Ну как, завести мап имён переменных на значения; ввести команды "записать переменную" и "прочитать переменную" вдобавок к имеющимся арифметическим.
Пара (стек,память) образуют состояние машины — это получается монада "состояние".
Поскольку калькулятор может засбоить (деление на ноль, чтение неизвестной переменной, исчерпание стека) — то надо скрестить с монадой Maybe.
Получится MaybeT (State ([Float], Map String Float))
где [Float] — это стек, Map String Float — таблица переменных...
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.