1

これは、この質問に続きます。

理由:

... = ... x :: a ...

として定義されていない

... = ... x `asTypeOf` (undefined :: a) ...

つまり、型宣言ではなく代入文で?

(注: 、または などa、何でもかまいません)IntaMaybe a

追加の質問として、どのコードが としての定義x :: aを破るでしょうx `asTypeOf` (undefined :: a)か? 同様に、有効なコードを無効にしたり、異なる動作をさせたりしますか?

4

1 に答える 1

6

型シグネチャの型変数は暗黙的な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式型シグネチャでは表現できなくなります。

于 2012-08-01T03:14:02.387 に答える