ideoneで境界チェックを行うコードを次に示します。
範囲外エラーなしで正常に実行されます。
このコードでは、 34行目でに変更しましreadArray
たがunsafeRead
、それでもコンパイルされますが、スタックオーバーフローでクラッシュします。
これはGHCのバグですか、それとも何か間違ったことをしましたか?
unsafeRead
0ベースのインデックスを使用するため、読み取り用にインデックスを調整する必要があります。
elem <- unsafeRead arr (i-1)
または、最小のインデックスが0の配列を割り当てる方がよいでしょう。
arr <- newArray (0,upperbound) maxBound
現状ではunsafeRead
、配列内の間違った場所からの読み取り。
無関係:ideoneは32ビットGHCを使用していると思われるので、upperbound > 100000
そこでコードを実行しない方がよいでしょう。