1

这是从这个问题开始的。

为什么是:

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

未定义为

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

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

(注意:a可以是任何东西,即IntaMaybe a

作为一个额外的问题,什么代码会破坏定义x :: ax `asTypeOf` (undefined :: a)?例如,它会使任何有效代码无效或行为不同吗?

4

1 回答 1

6

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

所以签名

x :: a

意味着x可以有任何类型,而在

x `asTypeOf` (undefined :: a)

undefined是多态的,它x的类型通过使用asTypeOf.

所以这两个做完全不同的事情。

在链接问题的情况下,

f `asTypeOf` (undefined :: Maybe a)

涉及到两种强制,一方面,类型变量af'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将不再可以通过表达式类型签名来表达。

于 2012-08-01T03:14:02.387 回答