OCaml重新定义中缀运算符
问题描述:
一个练习问题要求解释为什么这不起作用。显然,从运行代码我发现它没有,但我没有看到在这种情况下为什么。这个错误并没有说明太多!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.
谢谢!
答
让我们一步一步来。火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
所以INT - > INT - > INT - > INT能被读为输入:int - > int和output:int - > int,或(int - > int) - >(int - > int)?也就是说,它的输入是一个int类型的函数吗? – Krpcannon
否'int - > int - > int - > int'意味着'int - >(int - >(int - > int))'并且只有那个。虽然'(int - > int) - >(int - > int)'表示一个函数,它接受一个'int-> int'函数并返回一个'int-> int'函数 – Kostya
谢谢@Kostya,这个目标函数根本的误解 - 签名值是正确的联想。 – Krpcannon