soutaroのHaskellにっき

2006-06-13

Haskellにはvalue restriction(値多相)がない件 Haskellにはvalue restriction(値多相)がない件 - soutaroのHaskellにっき を含むブックマーク はてなブックマーク - Haskellにはvalue restriction(値多相)がない件 - soutaroのHaskellにっき

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って、なんで必要なんだっけ…

Haskellは面白いなあ Haskellは面白いなあ - soutaroのHaskellにっき を含むブックマーク はてなブックマーク - Haskellは面白いなあ - soutaroのHaskellにっき

MLとほとんど同じ型システムだと思っていたが、全然違う。(遅延評価とかに興味がない人)

syd_sydsyd_syd2006/06/14 23:17value restrictionが何故必要なのか、僕も興味があります。。。