Стандартные статические ошибки 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

Это (в основном) эквивалентное определение.

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