标准 ML 静态错误

Standard ML static errors

我必须编写一个函数来计算此数据类型:

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)));

这有什么问题吗?!

有什么帮助吗?

首先,您有语法错误:第一个 => 应该是 =val 声明的一部分)。

其次,您在 compute 的递归调用中放置括号是错误的:您使用单个参数调用它(这将是将 e1 应用于两个参数的结果xy).

这是一个应该有效的表格:

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

这是一个(大部分)等效的定义。