2016-11-06 55 views
1

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

# 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. 

谢谢!

回答

4

让我们一步一步来。火REPL和类型:

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

我们可以解释这个int -> int -> int -> int作为中缀+运营商,它有两个int S和返回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 
+0

所以INT - > INT - > INT - > INT能被读为输入:int - > int和output:int - > int,或(int - > int) - >(int - > int)?也就是说,它的输入是一个int类型的函数吗? – Krpcannon

+2

否'int - > int - > int - > int'意味着'int - >(int - >(int - > int))'并且只有那个。虽然'(int - > int) - >(int - > int)'表示一个函数,它接受一个'int-> int'函数并返回一个'int-> int'函数 – Kostya

+0

谢谢@Kostya,这个目标函数根本的误解 - 签名值是正确的联想。 – Krpcannon