以下是this问题。
为什么:
... = ... x :: a ...
未定义为
... = ... x `asTypeOf` (undefined :: a) ...
即。在赋值语句中,不是类型声明?
(注意:a
可以是任何内容,即Int
,a
或Maybe a
)
作为一个额外的问题,哪些代码会将x :: a
定义为x `asTypeOf` (undefined :: a)
?如何,是否会使任何有效代码无效或表现不同?
答案 0 :(得分:6)
您必须知道签名类型中的类型变量带有隐式forall
。
所以签名
x :: a
表示x
可以包含任何类型,而在
x `asTypeOf` (undefined :: a)
undefined
是多态的,并且使用x
将其类型强制转换为asTypeOf
类型。
所以这两个人完全不同。
如果是关联问题,
f `asTypeOf` (undefined :: Maybe a)
涉及两个强制,一方面,类型变量a
被f
的类型强制,另一方面,f
的类型中的monad被强制到Maybe
。
响应编辑:签名
x :: Maybe a
仍然承诺x
可以每个 Maybe
类型。如果有人想将它用作Maybe Bool
,那是可能的。也是Maybe (Either (IO [Int]) (Double, (), Rational))
。
但是在
x `asTypeOf` (undefined :: Maybe a)
forall'ed类型变量a
可以通过x
的静态类型进行细化。如果是Monad m => m SomeComplicatedType
,undefined
上的表达式类型签名会强制m
类型中的类型变量x
,m
的类型参数会改进从a
的表达式签名中输入变量undefined
。
如果表达式类型签名x :: a
具有x `asTypeOf` (undefined :: a)
的语义,则x :: a
的当前语义将不再由表达式类型签名表达。