let t = 関数型プログラミング言語ML 2
レス数が900を超えています。1000を超えると表示できなくなるよ。
0945デフォルトの名無しさん
NGNG# let rec f x = g x + g x
and g x = f x;;
そして、g x = f x は、g = fun x -> f x の糖衣構文であることに注意する。
すると、f, g は共にラムダ抽象なので、評価が進まないことがわかる。
ところで、
# let rec f x = g x + g x
and g = f;;
は、g はこの時点ではラムダ抽象では*ない*(変数だと思え!)ので、この時点で
評価を進ませることが出来て、一歩進むと、
let rec f x = f x + f x
のようになり、あきらかに定義できない。(let rec x = 1 + x が定義できないように。)
このように、明らかに定義できない部分は蹴っている。
型ぐらいみろ、と思うかもしれないが、
f : 'a -> 'a は、f 1 とすると値だけど、f (fun x -> x) とすると、
ラムダ抽象。要するに、どっちも来うるので、安全側に倒しているのだろう。
私も良く分かっていませんが。
レス数が900を超えています。1000を超えると表示できなくなるよ。