Предполагая, что ваше представление выражения выглядит как
type expression = App of expression * expression
| Lambda of ident * expression
(* ... *)
, у вас есть функция subst (x:ident) (e1:expression) (e2:expression) : expression
, которая заменяет все свободные вхождения x
на e1
в e2
, и вы хотите нормальную оценку порядка, ваш код должен выглядеть примерно так:
let rec eval exp =
match exp with
(* ... *)
| App (f, arg) -> match eval f with Lambda (x,e) -> eval (subst x arg e)
Функция subst
должна работать следующим образом:
Для приложения-функции оно должно вызывать себя рекурсивно для обоих подвыражений.
Для лямбда-выражений он должен вызывать себя в выражении тела лямбды, если только имя аргумента лямбды равно идентификатору, который вы хотите заменить (в этом случае вы можете просто оставить лямбду, потому что идентификатор не может отображаться свободно в любом месте внутри него).
Для переменной он должен либо возвращать переменную без изменений, либо выражение-замену в зависимости от того, совпадает ли имя переменной с идентификатором.
person
sepp2k
schedule
28.10.2010