这是从这个问题开始的。
为什么是:
... = ... 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
有各种类型。如果有人想将它用作,那是可能的。作为一个太。 Maybe
Maybe Bool
Maybe (Either (IO [Int]) (Double, (), Rational))
但在
x `asTypeOf` (undefined :: Maybe a)
forall'ed 类型变量a
可以通过x
's 静态类型进行细化。如果是Monad m => m SomeComplicatedType
,则表达式类型签名会强制转换 的类型中undefined
的类型变量,而 的类型参数会从的表达式类型签名中细化类型变量。m
x
m
a
undefined
如果表达式类型签名x :: a
具有 的语义x `asTypeOf` (undefined :: a)
,则 的当前语义x :: a
将不再可以通过表达式类型签名来表达。