0

我在玩-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$
4

1 回答 1

4

在 ML 中,所有函数都只接受一个参数。一个看似多参数的函数实际上是一个接受一个参数的函数,并返回另一个接受剩余参数的函数。

所以let c d e = ...实际上是语法糖let c = function d -> function e -> ...

的类型cint -> int -> unit,并且->是右结合的,所以它是int -> (int -> unit)。所以你可以清楚地看到这是一个接受int和返回函数的函数。

当您将它应用于多个参数c 1 2时,函数应用程序是左关联的,因此它实际上是(c 1) 2,因此您可以看到c 1计算结果为一个函数,然后将其应用于2.

所以,当你给一个函数“参数太少”时,结果就是一个函数。这是 ML 中一种有用且常见的技术,称为“部分应用程序”,它允许您以便捷的方式“修复”函数的前几个参数。

当您键入的表达式计算为函数时,我不确定 Caml Light 解释器如何处理它。但从你所说的来看,它似乎没有打印任何东西。

于 2013-03-17T19:48:14.527 回答