Оценщик в 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.
Веселого вам функционального программирования. знак равно