次の悪いコードを検討してください:
fun x =
if (null x) then 0
else (take 50 x) : (fun (drop 50 x))
問題なくghciにロードできることに気づきました。それが問題です。
この関数を評価しようとすると、プログラムはエラーを取得するだけです。
if ... then ... else 式のデフォルトの推論規則に関して、2 つの分岐が明示的に異なる型を取得するため、このコードをロード (コンパイル) できるのはなぜですか? つまり、なぜコンパイラはこのコードが不正であると判断できないのでしょうか?
注:もちろん、この関数に正しい型注釈を追加すると、予想どおり拒否されますが、私の理解では、型注釈なしでも拒否する必要があります。