誤読してるような気もするので、こっちにこっそり書く

L'eclat des jours(2007-05-21)

ML(やHaskell)で

let f x y z = () in (* = let f = fun x -> (fun y -> (fun z -> ())) *)
  f 1 2 3

let f (x, y, z) = () in 
  f (1, 2, 3)

の違いは、部分適用できるかどうかで、

let g f y z = g f (y z) in
  g (f 1) 2 3

とできたら嬉しい場合があるのです。let g f (y,z) = f (y,z) in g (fun (x,y) -> f (1, x, y)) (2, 3)との違い。

つまり、Haskell(やML)の場合は、高階関数があるので、関数適用の返り値が関数であっても良い。逆にCやRubyでは高階関数は無いから、メソッドの返り値がメソッドになることはありません。

あとHaskellの場合は、純粋関数型なので、関数適用の時点で引数の値は決定しているような気がします。

ということなのかなぁ。


()の有無については良くわかりません。OCamlだと、f 1, 2, 3 = ((f 1), 2, 3)f (1, 2, 3)で意味変わっちゃうし。逆に意味が変わらない言語なら、まったく一緒ですけど。(あ、そういう意味か。)