0
は Int
のインスタンスInt
は _
のインスタンスInt
は Int
自身の部分型関数適用時の型検査においては、ただの項や束縛変数が引数の型に合致するかどうかは「部分型検査」ではだめ。なぜなら、Int
型を期待している引数に渡せるのは0
や1
であって、Int
自身ではないから。だから、部分型関係ではなく「aはbのインスタンスか」という関係性が必要になる。一方で、自由変数の場合は部分型関係で大丈夫。
ある項が型tである事を期待するとき、「型tを表す値」が入ることを許容してはいけない。Int 型の引数に0や1ではなくIntを渡してはいけない。
Glispが型付けを導入したい最大の動機は、
「ボトム型はすべての型の部分型である」という定義に倣って、ボトム型とそれ以外の型との合併はボトムが無視される。(例: (| () Int) → Int
)つまり、全ての関数がボトムを返し得る(=部分関数)し、それはHaskellでいうMaybe
型のように返り値として明示する必要はない。この問題は何かというと、あらゆる値はどう型付けされようと、ボトムである可能性を排除できない為に、仮に型検証が済んでいるにしても実行時にその値がボトムかどうかをチェックし、必要あらば引数の型デフォルトに置き換えなくてはならないということ。