type Block = IO ()
type Procedure a = a -> Block
newtype MyIO a = MyIO (Procedure (Procedure a))
instance Monad MyIO where ・・・

・型パラメータなしのIOを発見 ←Monadではない
・Procedureを発見 ←Monadではない
・型パラメータありのIOを発明 ←更にパラメータを増やせばIOと直接関係なくなる
というイメージ
MonadとIOの関係は元々どこかにあったのではなく意図的に作られたように思える