06/12/11 22:57:29
>>436
>すまん。読んでたけどそっちも全く意味わからんかった。
ボトムっていうのは、停止しない/エラーになる計算の結果を表す概念上の値のこと。
(この辺厳密じゃないかも。間違ってたら分かってる人が突っ込んでくれることを期待)
例えば
b :: Int
b = b
と定義したとする。bを評価しようとすると止まらないから、bにはふつうの意味での値はない。しかし、
f :: Int -> Int
f x = 4
という関数があったとして、f bは4を返す。つまりfは問題なく呼ばれている。
では呼ばれたときの引数は何か、というのが問題になるが、これを「fはボトムを引数にして呼ばれた」
ということにする。つまり、bは評価しても止まらないけど、ボトムという仮想的な値を持っていることにする。
こうすると議論が単純になる。ちなみに、こう考えると、BoolにはTrue、False、ボトムの三値があることに
なるし、32ビットマシン上のGHCではIntに2^32+1個の値があることになる。
一方、実装を考えると、fに渡されるのは未評価のbで、これの実体はクロージャ、
あるいは関数ポインタ。bを評価することは、この関数ポインタを呼び出すことに相当する。
この場合はbを評価しようとすると止まらないわけだけど、こういう挙動がありえるためにはそもそも
bが関数ポインタでなきゃならない。
unboxed typeはただの計算器上の整数で、関数ポインタを隠し持つ余地はない。
Int#は厳密に2^32個の値しかとれない。つまり、ボトムになれない。よってunlifted type。
>あっちは圏論の話題が中心だから、初歩的なことは書きづらくて・・・。
たまたま圏論の話題で盛り上がっていただけで、気にすることはないと思う。
もともとそういうスレじゃないし。むしろ俺にも分かる話題は歓迎w