Стандартные статические ошибки ML
Я должен написать функцию, которая вычисляет этот тип данных:
datatype Expr = X
| Y
| Avg of Expr * Expr
| Mul of Expr * Expr;
и я не могу найти ошибку в следующей функции;
val rec compute => fn X => (fn x => fn y => x)
| Y => (fn x => fn y => x)
| Avg (e1, e2) => (fn x => fn y => (compute(e1 x y) + compute(e2 x y) div 2))
| Mul (e1, e2) => (fn x => fn y => (compute(e1 x y) * compute(e2 x y)));
Что в этом плохого?!
Любая помощь, пожалуйста?
1 ответ
Решение
Во-первых, у вас есть синтаксическая ошибка: первый =>
должен быть =
(часть val
декларация).
Во-вторых, вы ставите скобки в рекурсивных вызовах compute
неправильно: вы вызываете его с одним аргументом (который будет результатом применения, например, e1
на два аргумента x
а также y
).
Вот форма, которая должна работать:
val rec compute =
fn X => fn x => fn y => x
| Y => fn x => fn y => x (* you probably meant y? *)
| Avg (e1, e2) => fn x => fn y => compute e1 x y + compute e2 x y div 2
| Mul (e1, e2) => fn x => fn y => compute e1 x y * compute e2 x y
Это становится немного лучше, если вы используете синтаксическую аббревиатуру, которая является fun
синтаксис:
fun compute X x y = x
| compute Y x y = y
| compute (Avg (e1, e2)) x y = compute e1 x y + compute e2 x y div 2
| compute (Mul (e1, e2)) x y = compute e1 x y * compute e2 x y
Это (в основном) эквивалентное определение.