SML从数据类型调用函数

SML从数据类型调用函数,sml,Sml,我正在学习sml,我被困在一个练习中。他们给了我一个这样的数据类型 datatype Expr = X |Y | Avg of Expr * Expr | Mul of Expr * Expr 我需要编写一个名为compute的函数,这样我就可以在函数类型为 Expr -> int -> int -> int 所以我做了这个 val rec compute = fn X =

我正在学习sml,我被困在一个练习中。他们给了我一个这样的数据类型

datatype Expr =  X
                |Y
                | Avg of Expr * Expr
                | Mul of Expr * Expr
我需要编写一个名为compute的函数,这样我就可以在函数类型为

Expr -> int -> int -> int
所以我做了这个

val rec compute =   fn X => (fn x => fn y => x)
                | Y => (fn x => fn y => 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))
现在我需要从终端调用它,但我不知道如何调用该函数。。我试过了

compute Avg 4 2;
但它给了我

    poly: : error: Type error in function application.
   Function: compute : Expr -> int -> int -> int
   Argument: Avg : Expr * Expr -> Expr
   Reason: Can't unify Expr to Expr * Expr -> Expr (Incompatible types)
Found near compute Avg 4 2
Static Errors
有人能给我指点迷津吗?多谢大家 另外,有没有一种方法可以让它变得有趣呢?Avg不是Expr类型的值,它是一个从一对Expr创建Expr的构造函数。 编译器也会在错误消息中指出这一点:

Avg : Expr * Expr -> Expr
您应该这样使用它:

compute (Avg(Y,X)) 4 2
这等于3

您的函数已经正确,但使用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)

编写函数的另一种方法是:

fun compute e x y =
    case e of
        X => x
      | Y => y
      | Avg (e1, e2) => (compute e1 x y + compute e2 x y) div 2
      | Mul (e1, e2) => compute e1 x y * compute e2 x y