せっかくなので、元々のコードの方について、メモリ表現を覗けるようにしてみました。
以下のgistに貼り付けてあります。
https://gist.github.com/takenobu-hs/751aed055481d3594cf439a40790119bCoerce2.hsを手元のUbuntuでコンパイルして実行すると、16進数で「0x4000_0000_0000_4645」を出力します。
Execution.txt の方には、ghcコマンドオプションでのstg, cmm, アセンブリのダンプ結果と、最終バイナリの逆アセンブル結果を付けています。
「0x4000_0000_0000_4645」の値は、objdump -D での逆アセンブルの箇所で、Main_boolzuvar1_closure から、+9 byte目からの8byteに一致しています。
(4a4309 番地から、4a4310番地までの値。)
ということで、まさに、True_closure + 9 からの8byteを拾っている挙動ですね。
いずれにしても、GHCi含めて、その時々の後続のメモリを素直に拾っているというとこですね。
そもそもunsafeの非保証動作の場合ですね:slightly_smiling_face: