ghci 将类型显示为具体的

ghci shows type as being concrete

我有以下代码:

{-# LANGUAGE GADTs #-}
data Exp' a where
  Float' :: (Num a) => Float -> Exp' a
g = Float' 1.2

如果我直接将上面的代码输入 ghci,并检查 g 的类型,我会得到:

GHCI> let g = Float' 1.2
GHCI> :t g
g :: Num a => Exp' a

以上是我的预期。

但是,当使用上述代码加载文件时,我得到的是:

GHCI> :load <filename>
GHCI> :t g
g :: Exp' Integer

知道行为为何不同吗?提前致谢。

此行为是由源文件中启用但在 GHCi 中禁用的 monomorphism restriction 引起的。

基本上,规则是没有参数的变量绑定总是被推断为具有具体类型。在您的情况下,绑定 g = Float' 1.2 没有参数,因此它的 Num 约束在推断类型时将默认为 Integer。

您可以看到,如果添加伪参数,行为会发生变化:

g () = Float' 1.2

或者如果你只是禁用单态限制:

{-# LANGUAGE NoMonomorphismRestriction #-}