haskell - 合格导入后的"模糊类型变量"

jim*_*myt 1 import haskell functional-programming qualified

我有一点问题,以了解haskell中的错误消息.

例如:

import qualified Data.Map as M

test = M.empty
Run Code Online (Sandbox Code Playgroud)

此代码运行应该没有收到任何错误消息.

输出如下:

*Main> test

fromList []
Run Code Online (Sandbox Code Playgroud)

但如果我尝试这样的话

import qualified Data.Map as M

test = do print M.empty
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误消息

Ambiguous type variable `k0' in the constraint:
      (Show k0) arising from a use of `print'
    Probable fix: add a type signature that fixes these type variable(s)
    In a stmt of a 'do' block: print M.empty
    In the expression: do { print M.empty }
    In an equation for `test': test = do { print M.empty }
Run Code Online (Sandbox Code Playgroud)

所以我认为它与print语句有关.

但是如果我在控制台中尝试它(ghci)

Prelude Data.Map> print empty
fromList []
Run Code Online (Sandbox Code Playgroud)

一切正常.

所以我希望有人可以解释我的问题所在.

提前致谢.

Dan*_*her 7

此代码运行应该没有收到任何错误消息.

在源文件中,它不应该.

import qualified Data.Map as M

test = M.empty
Run Code Online (Sandbox Code Playgroud)

推断类型testOrd k => Map k a具有约束类型变量的多态类型.由于test不是函数且没有类型签名,因此通过单态限制,必须通过将约束类型变量解析为默认类型来使其类型变为单态.由于这里唯一的约束是Ord,默认规则禁止默认类型变量(必须至少有一个数字约束才能允许默认).

因此,语言标准要求编译失败.

但是,在ghci中,有一些扩展的默认规则允许默认类型.如果要打印test,Show则会在两个类型变量上引入进一步的约束,并且ghci 在要求打印时默认为testto 的类型Map () ().