这是从这个问题开始的。
为什么是:
... = ... x :: a ...
未定义为
... = ... x `asTypeOf` (undefined :: a) ...
即在赋值语句中,而不是类型声明?
(注意:a可以是任何东西,即Int,a或Maybe a)
作为一个额外的问题,什么代码会破坏定义x :: a为x `asTypeOf` (undefined :: a)?例如,它会使任何有效代码无效或行为不同吗?
这是从这个问题开始的。
为什么是:
... = ... x :: a ...
未定义为
... = ... x `asTypeOf` (undefined :: a) ...
即在赋值语句中,而不是类型声明?
(注意:a可以是任何东西,即Int,a或Maybe a)
作为一个额外的问题,什么代码会破坏定义x :: a为x `asTypeOf` (undefined :: a)?例如,它会使任何有效代码无效或行为不同吗?
您必须知道类型签名中的类型变量带有隐含的forall.
所以签名
x :: a
意味着x可以有任何类型,而在
x `asTypeOf` (undefined :: a)
它undefined是多态的,它x的类型通过使用asTypeOf.
所以这两个做完全不同的事情。
在链接问题的情况下,
f `asTypeOf` (undefined :: Maybe a)
涉及到两种强制,一方面,类型变量a被f's 类型强制,另一方面, 's 类型中的 monadf被强制为Maybe。
作为对编辑的回应:签名
x :: Maybe a
仍然承诺可以x有各种类型。如果有人想将它用作,那是可能的。作为一个太。 MaybeMaybe BoolMaybe (Either (IO [Int]) (Double, (), Rational))
但在
x `asTypeOf` (undefined :: Maybe a)
forall'ed 类型变量a可以通过x's 静态类型进行细化。如果是Monad m => m SomeComplicatedType,则表达式类型签名会强制转换 的类型中undefined的类型变量,而 的类型参数会从的表达式类型签名中细化类型变量。mxmaundefined
如果表达式类型签名x :: a具有 的语义x `asTypeOf` (undefined :: a),则 的当前语义x :: a将不再可以通过表达式类型签名来表达。