从GHCi中的a = 2+2.0
文件加载.hs
,并:t a
显示a :: Double
。
另一方面,在GHCi中执行let b = 2+2.0
和:t b
会显示b :: Fractional a => a
。
您如何从这两份文件中推断出这一点?
我发现这个官方文档几乎无法理解。
答案 0 :(得分:6)
This documentation就是你想要的。基本上,GHC默认情况下GHC实现的语言不同于模块;特别是,在模块中默认启用可怕的单态限制(根据语言),而在GHCi中它被禁用。单态限制是导致GHC为您的a
选择单态类型的原因,而在关闭它的情况下,GHC可以自由地推广b
的类型,从而产生您看到的多态类型。
答案 1 :(得分:2)
关键是GHCi不会违反b
的类型。它采用约束2 :: Num a => a
和2.0 :: Fractional a => a
并将它们统一为2 + 2.0 :: Fractional a => a
。加载模块时,编译器会强制每个值都具有具体类型,因此Fractional a
默认为Double
。