OCaml重新定义中缀运算符

时间:2016-11-06 10:58:29

标签: functional-programming ocaml infix-notation

练习题要求解释为什么这不起作用。显然,从运行代码我发现它没有,但在这种情况下我没有看到为什么。这个错误并没有太多说明!

# let (+) x y z = x + y + z in 5 + 6 7;;
Error: This expression has type int
   This is not a function; it cannot be applied.

谢谢!

1 个答案:

答案 0 :(得分:4)

让我们一步一步走。触发REPL并输入:

# let (+) x y z = x + y + z;;
val ( + ) : int -> int -> int -> int = <fun>

我们可以将此int -> int -> int -> int解释为一个中缀+运算符,该运算符需要两个int并返回一个int -> int函数

让我们检查:

# let f = 5+6;;
val f : int -> int = <fun>
# f 7;;
- : int = 18

这是您预期计划的每一步工作 您的代码的问题是这不起作用:

# 5+6 7;;
Error: This expression has type int
   This is not a function; it cannot be applied.

这是因为函数应用程序优先于+运算符。 (实际上,函数应用程序在OCaml中具有最强的优先级。)因此添加括号,修复它(您需要重新启动顶层):

# let (+) x y z = x + y + z in (5+6) 7;;
- : int = 18