我正在玩-
作为一元运算符和caml-light中的二元运算符之间的区别。
let a b =
print_int b;
print_newline();
;;
let c d e =
print_int d;
print_newline();
print_int e;
print_newline();
;;
a (3 - 4 ) ;
c (9 - 4 )
;;
我希望代码抛出一个错误(因为它对a或c有多少参数感到困惑)或打印:
-1
5
但是,它编译没有问题(下面的编译器版本)和打印 -1
有人能告诉我上一次电话会发生什么吗?
Cobrakai$camlc -v
The Caml Light system, version 0.80
(standard library from /usr/local/lib/caml-light)
The Caml Light runtime system, version 0.80
The Caml Light compiler, version 0.80
The Caml Light linker, version 0.80
Cobrakai$
答案 0 :(得分:4)
在ML中,所有函数只接受一个参数。一个看似多参数的函数实际上是一个接受一个参数的函数,并返回另一个接受剩余参数的函数。
所以let c d e = ...
实际上是let c = function d -> function e -> ...
c
的类型为int -> int -> unit
,->
为右关联,因此为int -> (int -> unit)
。所以你可以清楚地看到这是一个需要int
并返回一个函数的函数。
当你将它应用于c 1 2
这样的多个参数时,函数应用程序是左关联的,所以它实际上是(c 1) 2
,所以你可以看到c 1
求值为一个函数,然后是已应用于2
。
所以,当你给一个函数“参数太少”时,结果就是一个函数。这是ML中一种有用且常用的技术,称为“部分应用程序”,它允许您方便地“修复”函数的前几个参数。
当您键入的表达式求值为函数时,我不确定Caml Light解释器如何处理它。但是根据你所说的,似乎没有打印任何东西。