Функция OCaml для оценки сложения и вычитания - PullRequest
0 голосов
/ 25 сентября 2018

В настоящее время я пытаюсь написать функцию 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.

Есть ли что-то, о чем я должен думать или иметь в виду?Любые отзывы приветствуются.Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

Как упомянул @Amadan, проще определить функцию, которая сначала будет оценивать выражение как int eval_exp: exp -> int.Затем вы можете просто оценить оба выражения в кортеже Equal(e1, e2) и сравнить их (eval: equation -> bool).

Вам также не нужны значения True и False в типе equation, потому что вы можете просто вернуть bool из функции без сопоставления с образцом.Обратите внимание, что вам могут понадобиться True и False, если вы по какой-то причине передали их снова функции eval.

type equation =
  Equal of exp * exp
and exp =
  | Val of int
  | Add of exp * exp
  | Sub of exp * exp

let rec eval (e: equation) : bool =
  let rec eval_exp e =
    match e with
    | Val i -> i
    | Add (e1, e2) -> (eval_exp e1) + (eval_exp e2)
    | Sub (e1, e2) -> (eval_exp e1) - (eval_exp e2)
  in
  match e with
  | Equal (e1, e2) ->
      if (eval_exp e1) = (eval_exp e2)
      then true
      else false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...