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 #-}
我有以下代码:
{-# 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 #-}