型推論の不思議
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というエラーが出た。