Исправление пробелов, определение типа данных и определение true_of_all_constants (p, e)
становятся:
datatype exp =
Constant of int
| Negate of exp
| Add of exp * exp
| Multiply of exp * exp
fun true_of_all_constants (p, e) =
let fun aux (Constant i) = p i
| aux (Negate e1) = aux e1
| aux (Add (e1, e2)) = aux e1 andalso aux e2
| aux (Multiply (e1, e2)) = aux e1 andalso aux e2
in aux e end
Здесь constant
было переименовано в Constant
: оба будут работать, но именование конструкторов с заглавной буквой визуально отличает его от других идентификаторов. И я использовал внутреннюю функцию aux
, чтобы немного сократить рекурсивные выражения. Вместо f
я назвал это p
для предиката , но это вещь вкуса.
Пытаясь оценить их, я всегда получаю ошибки
Вот несколько примеров выражений и их оценка:
- val two_plus_two = Add (Constant 2, Constant 2);
- true_of_all_constants (fn i => i = 2, two_plus_two);
> val it = true : bool
- val two_times_neg_two = Multiply (Constant 2, Constant ~2);
- true_of_all_constants (fn i => i > 0, two_times_neg_two);
> val it = false : bool
- val two_four_six = Add (Constant 2, Add (Constant 4, Constant 6));
- fun is_even x = x mod 2 = 0;
- true_of_all_constants (is_even, two_four_six);
> val it = true : bool
Не могли бы вы объяснить, что здесь делает тип данных?
Я думаю, вам следует обратиться к книге или учебнику здесь.
Например, ML для работающего программиста, гл. 4 (бесплатный PDF) имеет дело с datatype
определениями.
Я не понимаю, зачем нам здесь "Negate" или "Add"
Я тоже не знаю. Проблема, которую вы задали в курсе, является полностью гипотетической.