型シグネチャの型変数は暗黙的な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
を持つことができるとまだ約束しています。誰かがそれを として使用したい場合、それは可能です。としても。 Maybe
Maybe Bool
Maybe (Either (IO [Int]) (Double, (), Rational))
しかし、
x `asTypeOf` (undefined :: Maybe a)
forall された型変数は、 の静的型a
によって絞り込むことができますx
。それが である場合Monad m => m SomeComplicatedType
、 の式の型シグネチャundefined
は の型の型変数m
を強制しx
、 の型パラメータはの式の型シグネチャからm
型変数を絞り込みます。a
undefined
式型シグネチャx :: a
が のセマンティクスを持っていた場合x `asTypeOf` (undefined :: a)
、 の現在のセマンティクスはx :: a
式型シグネチャでは表現できなくなります。