Haskell新手编写代码出现约束默认到Integer类型的警告如何解决
问题相关代码
触发警告的完整代码如下:
funk :: Num a => a -> a funk a = a + 10 main :: IO () main = print (funk 10)
对应触发的警告信息:
Warnings: 1 /home/anmnv/Desktop/qqq.hs: line 4, column 8: Warning: • Defaulting the following constraints to type ‘Integer’ (Show a0) arising from a use of ‘print’ at qqq.hs:4:8-23 (Num a0) arising from a use of ‘funk’ at qqq.hs:4:15-21 • In the expression: print (funk 10) In an equation for ‘main’: main = print (funk 10)
警告产生原因
这是Haskell类型系统的默认推导规则触发的提示,不属于代码错误:
- 你定义的
funk是多态函数,类型签名Num a => a -> a表示:该函数可以接收任意实现了Num类型类的数值类型参数,返回同类型的结果。 - 代码中调用
funk 10时,整数字面量10本身也是多态值,可以是任意Num类型类的实例类型(比如Int、Integer、Double等),而print函数要求传入的参数必须实现Show类型类。这时候编译器没有得到明确的具体类型指定,就会按照Haskell标准规定的默认规则,把这个未确定的多态类型默认选定为Integer,这个警告就是告知你编译器做了这个自动选择。
消除警告的方案
只需要给相关值显式指定具体的数值类型即可,两种常用写法:
- 给传入的字面量加类型标注:
main = print (funk (10 :: Integer)) -- 根据需求也可以替换为Int、Double等其他同时实现了Num和Show类型类的类型
- 给函数调用的整体结果加类型标注:
main = print (funk 10 :: Integer)
注意:就算不做任何修改,代码也可以正常运行输出20,这个警告只是提示类型默认选择的行为,不会阻断编译和执行。
内容的提问来源于stack exchange,提问作者WinnieNotThePooh
相关产品推荐
相关产品推荐

