型推論の不思議

 0除算でNothingを返す、mydivという関数を作ってみた。

mydiv1 _ 0 = Nothing
mydiv1 n d =  return (div n d)

 この関数をghciで実行してみると、問題なく動く。型推論の結果は(Integral a) => a -> a -> Maybe a。では、Nothingをこの定義からなくして、戻り値がMaybe aであると推論できなくしたらどうなるだろう?

mydiv2 n d =  return (div n d)

 この関数は、ちゃんと動かない。型推論の結果は(Integral a, Monad m) => a -> a -> m a。しかし、実行してもなんの結果も返ってこない。mydiv2 1 0とかやってもなんのエラーも起こらないので、divが実行されているかどうかすら怪しい。うーん、どんなreturnが使われているのだろうか…。ていうか、これはちゃんと推論が行えないから実行できない、というエラーを出してほしい場面のような気がする。
 …hugsで実行してみると、ちゃんとUnresolved overloadingというエラーが出た。