Scheme 继承了 LISP 的传统,没有强制的类型检查机制。一个函 数可以接受任意类型的参数,返回任意类型。这在很多时候是很方 便的。但是有时可能引起不明不白的错误。但是如果需要,Scheme 也可以自己实现类型系统。
CAML 有强制的类型检查和综合机制。类型检查使得操作更加安 全,但是缺少了某种灵活性。大部分时候不需要指明对象 的类型,解释器可以从上下文判断类型。举一个复杂一点的例子:
是否应该使用类型,这个问题不是程序语言自己能够解决的问题。这 涉及到对于自然最基本的理性思想和方法论问题。你怎样看待世界上 的事物?它们具有类型吗?我们怎样处理共性和个性的差别和联系?
CAML 强制用户把世界上的事物加以区别,这在很多时候是有用的。 但是有时这样会导致抹煞事物的共性。Scheme 没有提供类型机制, 但是用户可以自己创造类型系统,所以 Scheme 的灵活性要大一些。 但是并不是所有用户都有精力去制造自己的类型系统,所以 CAML 更 适合某些人的需要。
Curry 就是一个多元函数接受少量参数,变成一个更少参数的函数。 比如 f(xy)=x+y-1 接受一个常数 a,就变成另外一个函数 f(y)=a+y-1.
CAML 提供了 curry 机制,如果传递的参数少,一个函数就返回另 外一个含有更少参数的函数,这个函数又可以接受一些参数。直到 参数数量满足之后,函数才返回计算的结果。比如下面这种Newton method 的实现,本来 until 函数接受3个参数,但是最后的语句 只给了它两句,所以 newton 如果接受两个参数,就会返回一个 float->float 类型的函数。它还可以接受3个参数,第三个就被传 递给 until 返回的那个 float->float 函数作为“初始值”。
Scheme 本身没有 curry 的机制。Scheme 的函数不能根据传递的 参数的多少进行变化。虽然有宏机制可以扩展出这种功能,但是不 是每个用户都有精力来自己实现这种功能。