2006-06-13
■ Haskellにはvalue restriction(値多相)がない件

syd_sydさんのコメントに
Haskellには値多相がない
とあり、ええええ????と思ったので、試してみる。
まず、value restrictionはこういうやつ。OCamlで。
# let id x = x;; val id : 'a -> 'a = <fun> # let f = List.map id;; val f : '_a list -> '_a list = <fun> # f [1;2;3];; - : int list = [1; 2; 3] # f;; - : int list -> int list = <fun>
ここで、List.map idは値ではないので、fの型は単相型になり、一度int listに適用するとそれ以降ではfの型はint listになってしまう。こういう「値ではないやつ」の型が多相型にならないことを、value restrictionという。ちなみに「値」の定義はややこしいので省略するが、とりあえず「関数適用の途中のやつ」が値ではないと考えておけばよい。\x -> xは値だが、(\x y -> y) 1は値ではない。
では、ghciで。
Prelude> let f = map id Prelude> f [1,2,3] [1,2,3] Prelude> f ["a"] ["a"]
ふむ。value restrictionを仮定すれば、fの型は単相になるので、f [1,2,3]の後のf ["a"]でエラーになるはず。だが、なっていないので、value restrictionはないということになる。
ほおーーー
うーむ、value restrictionって、なんで必要なんだっけ…
コメント
syd_syd2006/06/14 23:17value restrictionが何故必要なのか、僕も興味があります。。。