Haskellが副作用をモナドで扱う件

親切な(Haskellerの?)方にコメント欄で (>>=) について教えていただいたので眺めてみた.
というのも,個人的に「Haskellの,副作用をモナドとして扱う手法は,実質的に『副作用アリの領域』を分離しているに過ぎない; Haskellは異質な命令型言語を内部に抱えている」という想像を作業仮説として持っていて,見たらちょっと考えが深まるかもと思ったんだが,どうもそう楽ではないようだ.
Prelude.hs ではHugsでのクラス Maybe, List, IO に対するオーバーロードの実体が分かったのだが,MaybeList は副作用とは無関係で,IO では primBindIO という組み込み関数に丸投げ.primBindIO の実体は src/iomonad.c にあったがどうもよく分からん.G-machineを知る必要アリ?
GHCBase.lhs ではクラス List に対するオーバーロードの実体だけ.ライブラリリファレンスによればクラス Monad に属する型はいくつもあるんだが,分散しているのか.