型シグネチャの型変数は暗黙的なforall.
だからサイン
x :: a
x任意の型を持つことができることを意味します
x `asTypeOf` (undefined :: a)
それundefinedはポリモーフィックであり、その型は をx使用して の型に強制されますasTypeOf。
したがって、これら2つはまったく異なることを行います。
リンク先の質問の場合、
f `asTypeOf` (undefined :: Maybe a)
一方では、型変数aは の型によって強制されf、他方では、 の型のモナドfは に強制されMaybeます。
編集への応答: 署名
x :: Maybe a
すべてのタイプxを持つことができるとまだ約束しています。誰かがそれを として使用したい場合、それは可能です。としても。 MaybeMaybe BoolMaybe (Either (IO [Int]) (Double, (), Rational))
しかし、
x `asTypeOf` (undefined :: Maybe a)
forall された型変数は、 の静的型aによって絞り込むことができますx。それが である場合Monad m => m SomeComplicatedType、 の式の型シグネチャundefinedは の型の型変数mを強制しx、 の型パラメータはの式の型シグネチャからm型変数を絞り込みます。aundefined
式型シグネチャx :: aが のセマンティクスを持っていた場合x `asTypeOf` (undefined :: a)、 の現在のセマンティクスはx :: a式型シグネチャでは表現できなくなります。