Haskellの Data.HashTable の lookup の型がbrain-damagedな件

lookup :: HashTable key val -> key -> IO (Maybe val)

常識で考えると lookup は純関数型になるはずだし,所詮はメモリ上の操作だからその常識から外れざるを得ない明確な理由はないのだが... 困ったAPIだなぁ.どうしてこうなった?

recordLookupデバッグ用で読み飛ばしてよいんで*1 findBucket に注目.等しいハッシュ値を持つ値のリスト "bucket" を取り出す辺りが IORef やら IOArray ベースなんで,全体がIO actionに汚染されてしまっている.どうにかならんのかね?
Okasaki本*2を読み進めるのはまぁ大事だが,それとは別に,人はパンと平衡木のみにて生くるにあらずと思うんだけどね.Haskellユーザってメモリ上のデータのアクセスパターンによるパフォーマンスの違いとか気にしない人々なのかなぁ.メモリ安・クロック(単価)高の近年においてはハッシュ表の重要性はいや増すばかりと信じているのだが.ただ確かに,(Haskell使ってるときに)ハッシュ表でないと駄目という例にぶち当たったことは今のところまだない.

*1:フラグ次第でnopと等価になるからと言って,こんなところに気軽に入れて本当にパフォーマンスに悪影響は無いのか?

*2:http://www.eecs.usma.edu/webs/people/okasaki/pubs.html#cup98 Chris Okasaki's Publications > Purely Functional Data Structures by Chris Okasaki. Cambridge University Press, 1998.