为什么"(2 + 2.0)"在.hs文件中加倍但是"分数a =>一个"在GHCi?

时间:2015-02-05 04:13:50

标签: haskell

从GHCi中的a = 2+2.0文件加载.hs,并:t a显示a :: Double

另一方面,在GHCi中执行let b = 2+2.0:t b会显示b :: Fractional a => a

您如何从这两份文件中推断出这一点?

我发现这个官方文档几乎无法理解。

2 个答案:

答案 0 :(得分:6)

我想,

This documentation就是你想要的。基本上,GHC默认情况下GHC实现的语言不同于模块;特别是,在模块中默认启用可怕的单态限制(根据语言),而在GHCi中它被禁用。单态限制是导致GHC为您的a选择单态类型的原因,而在关闭它的情况下,GHC可以自由地推广b的类型,从而产生您看到的多态类型。

答案 1 :(得分:2)

关键是GHCi不会违反b的类型。它采用约束2 :: Num a => a2.0 :: Fractional a => a并将它们统一为2 + 2.0 :: Fractional a => a。加载模块时,编译器会强制每个值都具有具体类型,因此Fractional a默认为Double