键入签名等效

Cli*_*ton 1 haskell type-inference

这是从这个问题开始的.

为什么是:

... = ... x :: a ...
Run Code Online (Sandbox Code Playgroud)

未定义为

... = ... x `asTypeOf` (undefined :: a) ...
Run Code Online (Sandbox Code Playgroud)

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

(注:a可以是任何东西,即Int,aMaybe a)

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

Dan*_*her 6

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

签名

x :: a
Run Code Online (Sandbox Code Playgroud)

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

x `asTypeOf` (undefined :: a)
Run Code Online (Sandbox Code Playgroud)

undefined是多态的,它x的类型通过使用强制转换为类型asTypeOf.

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

在链接问题的情况下,

f `asTypeOf` (undefined :: Maybe a)
Run Code Online (Sandbox Code Playgroud)

涉及两个强制,一方面,类型变量a是由类型强制的,另一方面是强制f类型的monad f被强制执行Maybe.

响应编辑:签名

x :: Maybe a
Run Code Online (Sandbox Code Playgroud)

还承诺,x可以有每一个 Maybe类型.如果有人想将它用作a Maybe Bool,那是可能的.作为一个Maybe (Either (IO [Int]) (Double, (), Rational)).

但在

x `asTypeOf` (undefined :: Maybe a)
Run Code Online (Sandbox Code Playgroud)

forall'ed类型变量a可以通过x静态类型进行细化.如果是这样Monad m => m SomeComplicatedType,在表达类型签名undefined胁迫的类型变量mx的类型和类型参数m提炼类型变量aundefined的表达类型签名.

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

  • 我还是有点困惑.你可以编辑你的答案给出一个例子,其中`x :: a`编译但是````asTypeOf`(undefined :: a)``没有(或产生不同的结果)?(除了`x`是定义而不是值的情况). (2认同)