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,a或Maybe a)
作为一个额外的问题,什么代码会破坏定义x :: a为x `asTypeOf` (undefined :: a)?如何,它会使任何有效的代码无效或行为不同吗?
您必须知道类型签名中的类型变量带有隐式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胁迫的类型变量m中x的类型和类型参数m提炼类型变量a从undefined的表达类型签名.
如果表达式类型签名x :: a具有语义x `asTypeOf` (undefined :: a),则当前语义x :: a将不再由表达式类型签名表达.