键入签名等效

时间:2012-08-01 03:08:30

标签: haskell type-inference

以下是this问题。

为什么:

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

未定义为

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

即。在赋值语句中,不是类型声明?

(注意:a可以是任何内容,即IntaMaybe a

作为一个额外的问题,哪些代码会将x :: a定义为x `asTypeOf` (undefined :: a)?如何,是否会使任何有效代码无效或表现不同?

1 个答案:

答案 0 :(得分:6)

您必须知道签名类型中的类型变量带有隐式forall

所以签名

x :: a

表示x可以包含任何类型,而在

x `asTypeOf` (undefined :: a)

undefined是多态的,并且使用x将其类型强制转换为asTypeOf类型。

所以这两个人完全不同。

如果是关联问题,

f `asTypeOf` (undefined :: Maybe a)

涉及两个强制,一方面,类型变量af的类型强制,另一方面,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 SomeComplicatedTypeundefined上的表达式类型签名会强制m类型中的类型变量xm的类型参数会改进从a的表达式签名中输入变量undefined

如果表达式类型签名x :: a具有x `asTypeOf` (undefined :: a)的语义,则x :: a的当前语义将不再由表达式类型签名表达。