Оценщик в OCaml/ML

type bool_exp =
    TT
  | FF
  | Var of string
  | And of bool_exp * bool_exp
  | Not of bool_exp ;;

 eval : bool_exp -> (string -> bool) -> bool

Я пытаюсь написать функцию оценщика под названием eval, Я очень плохо знаком с OCaml и не привык к синтаксису. Где я могу начать писать это?

2 ответа

Решение

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

let rec eval e env =
  match e with
    TT -> ...
  | FF -> ...
  | Var x -> ...
  | And (e1, e2) -> ...
  | Not e
;;

Первый аргумент e это выражение, которое должно быть оценено, а второе env часто называют средой, отображая переменные (представленные строками) на значения (здесь только булевы константы).

rec требуется всякий раз, когда определенная функция является рекурсивной (т. е. использует себя в теле функции), и поскольку ваш тип данных определяется рекурсивно, также eval будет рекурсивным Например, чтобы оценить And (e1, e2) Сначала вы должны знать значения e1 а также e2 в той же среде.

Это должно начать вас.

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

let rec eval e env =
  match e with
    TT -> true
  | FF -> false
  | Var x -> x env
  | And (e1, e2) -> (eval e1 env) && (eval e2 env)
  | Not e -> not (eval e env) ;;

Затем, запустив код для его тестирования, вы объявите функцию env, например:

let env y = true;;

Или же...

let env y = false;;

Поскольку типом является "eval: bool_exp -> (string -> bool) -> bool", вам необходимо определить, для чего предназначена функция (string -> bool), прежде чем использовать ее.

Так,

1. Declare data type bool_exp.
2. Declare that function I gave you.
3. Declare env as a function, either one you want, there's only two possible ones.
4. You can now use the function.

Веселого вам функционального программирования. знак равно

Другие вопросы по тегам