Оценка небольшого математического языка типов, который поддерживает одну переменную - PullRequest
6 голосов
/ 11 октября 2010

Я написал парсер, который читает строку ввода.Это работает.Я также написал оценщик, который выплевывает результат.Но есть одна маленькая деталь, которую я не могу реализовать.Посмотрите на следующий пример:

+(sw+(2,2),sr)

Предполагается, что конструкция sw этого крошечного языка оценивает "+ (2,2)" и хранит его где-то.Конструкция sr будет читать эту область хранения.Целое выражение over оценивается в 8.

Я думаю о том, чтобы использовать дополнительный параметр для функции eval, который хранит результат.Но я не вижу, чтобы это получалось.Заметьте, я новичок в Haskell, так что будьте добры.О, это домашнее задание.Так что не дай мне решения, дай подсказку.

1 Ответ

5 голосов
/ 11 октября 2010

Поскольку выражения могут считывать и записывать в область хранения, ваша функция оценки должна получить состояние памяти в качестве параметра и вернуть новое состояние в результате.

 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 ....

...