В настоящее время я пытаюсь написать функцию OCaml, которая будет оценивать выражения и возвращать логическое значение.Я пытался провести исследование онлайн, и самый близкий ответ, который я смог найти, это этот .Тем не менее, у меня все еще есть проблема, которая заставила меня задать свой собственный вопрос.
Вот основной код:
type equation =
| True
| False
| Equal of exp * exp
and exp =
| Val of int
| Add of exp * exp
| Sub of exp * exp
let rec eval : equation -> bool
= fun f ->
match f with
| True -> true
| False -> false
| Equal (x, y) -> match (x, y) with
| (Val a, Val b) -> if (x = y) then true else false
| ((Add (Val a, Val b), c) -> eval (Equal (Val (a + b), c))
Программа не завершена, и рекурсивный вызов eval
в последней строке я застрял.Конкретный пример ввода, о котором я подумал:1016 * сравнивает Val 6
с Val 6
.Проблема, с которой я сталкиваюсь, заключается в том, как рекурсивно вызвать функцию для вычисления второго Add
внутри выражения, так что Add (Val 2, Val 2)
сначала оценивается как Val 3
, затем первый Add
добавляет Val 3
с Val 3
.Программа, которую я написал прямо сейчас, оценивает только одну из двух Add
.
Есть ли что-то, о чем я должен думать или иметь в виду?Любые отзывы приветствуются.Спасибо.