Я изучаю sml, и я застрял в упражнении. Они дали мне тип данных, сделанный так
datatype Expr = X
|Y
| Avg of Expr * Expr
| Mul of Expr * Expr
и мне нужно написать функцию, называемую вычислением, чтобы я мог выполнять операцию усреднения или умножения, где тип функции
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
Может ли кто-нибудь провести меня через это? Спасибо всем P.S. Есть ли способ сделать это весело
Avg
не является значением типа Expr
, это конструктор, который создает Expr
из пары Expr
s.
Это также указывается вашим компилятором в сообщении об ошибке:
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