标准ML静态错误

时间:2015-07-27 16:10:01

标签: sml 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 个答案:

答案 0 :(得分:3)

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

其次,你将括号放在对compute的递归调用中是错误的:你用一个参数调用它(这是将e1应用于两个参数x的结果。 1}}和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

这是(大多数)等效的定义。