Monomorphism restriction

参考:Wiki

(1)
xor :: Bool -> Bool -> Bool
xor = (/=)

(2)
xor x y = (/=) x y
もしくは
xor x = (/=) x

人間的には(2は型指定したつもりになればw)両方とも同じなんだけど、(1)の方は明示的に型を指定してあげないとコンパイルエラーとなる。polymorphicにしたかったら関数の型にも寄るけど

neq :: (Eq a) => a -> a -> Bool
neq = (/=)

こういう感じにしてあげれば良いらしい。

不便だとは思うけど、まだそういう事を偉そうにほざけるほどHaskell使えてないから一年後くらいに自分の意見が言えたらと思う。とりあえず今のところは、このコンパイルエラーが出たらちゃんと型を指定してあげるか、(2)みたいな書き方してやれば良いということにしておく。

ちなみにGHCの場合は-fno-monomorphism-restrictionオプションでこういうのを許可することも出来る模様。