Unlifted Type

よくわからんが
http://hackage.haskell.org/trac/ghc/ticket/317

以下の話は、GHC6.4.2のghciでやった結果。GHCのバージョンが違ったり、コンパイルした場合や最適化した場合は挙動が変わるかも。ここ見ると、Int#とかのunlifted typeはbottomを含まない。従って

{-# OPTIONS -fglasgow-exts #-}
import GHC.Exts
loop :: Int#
loop = loop

とかやってもエラー。

{-# OPTIONS -fglasgow-exts #-}
import GHC.Exts
bot :: () -> Int#
bot () = bot ()
test  :: Bool
test   = stops (bot ())
  where
  stops  :: Int# -> Bool
  stops _ = True
main = print test 

Trueが返ってくる。

{-# OPTIONS -fglasgow-exts #-}
import GHC.Exts
bot :: () -> Int#
bot () = bot ()
stops  :: Int# -> Bool
stops _ = True
test  :: Bool = stops (bot ())
main = print test 

だと⊥に落ちる。

Int#をIntにした場合は、当たり前だけどどっちでも、Trueが返ってくる。bot関数がwell-definedでないんだと思うけど、超どうでもいいな。こないだから私はなんで、GHCの粗探しをしてるんだ?