Scheme 与 CAML 的比较

区别

类型

#let rec it_list f a = 
    function [] -> a 
           | x::l -> it_list f (f a x) l;;

>it_list : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>

从这里可以看出。CAML 解释器可以判断:it_list 是一个函数,它 接受两个参数,一个是 ('a -> 'b -> 'a) 类型的函数,一个是 'a 类型的数据,it_list 返回一个函数,这个函数接受一个 'b 类型的 list 作为参数,返回一个 'a 类型的数据。

这个判断是怎么做出的呢?解释器首先把 it_list 的参数 a 作为'a 类型,把 x::l 作为 'b 类型的 list。由于 it_list 有规则 []->a, 所以解释器知道 it_list 返回类型应该是接受 'b 类型list 参数,返回 'a 类型的函数。由于 (f a x) 同时可以作为 it_list 的第二个参数,所以解释器知道 f 的返回类型应该是 'a。从 (f a x) 的 a 和 x,解释器可以判断,f 接受两个参数,一个是 'a 类型 的数据,一个是 'b 类型的数据。

是否应该使用类型,这个问题不是程序语言自己能够解决的问题。这 涉及到对于自然最基本的理性思想和方法论问题。你怎样看待世界上 的事物?它们具有类型吗?我们怎样处理共性和个性的差别和联系?

CAML 强制用户把世界上的事物加以区别,这在很多时候是有用的。 但是有时这样会导致抹煞事物的共性。Scheme 没有提供类型机制, 但是用户可以自己创造类型系统,所以 Scheme 的灵活性要大一些。 但是并不是所有用户都有精力去制造自己的类型系统,所以 CAML 更 适合某些人的需要。

Curry

Curry 就是一个多元函数接受少量参数,变成一个更少参数的函数。 比如 f(x,y)=x+y-1, 接受一个常数 a,就变成另外一个函数 f(y)=a+y-1.

let deriv f x dx = (f(x+.dx) -. f(x)) /. dx;;
let abs x = if x >. 0.0 then x else -. x;;

let newton f epsilon = 
    let rec until p change x = 
        if p(x) then x 
        else until p change (change(x)) in 
        let satisfied y = abs(f y) <. epsilon in 
            let improve y = y -. (f(y) /. (deriv f y epsilon)) 
            in until satisfied improve;;