我没想到以下代码可以工作:
foo :: (Num a) => a -> a
foo x = x + x
main = do
print (foo (read "7"))
因为无法根据代码完全推断(阅读“7”)的类型。但是 GHC (6.12.3) 不这样认为并打印 14。
如果将“7”更改为“7.2”,则代码将失败并显示“no parse”。这里发生了什么? Haskell 如何决定使用哪个 Read 实例?
最佳答案
这是由 Haskell 的 defaulting rules for the Num
class 引起的。 .如果您添加了
default (Double, Integer)
到文件的顶部,然后你会得到以下结果:
main = do
print (foo (read "7")) -- prints "14.0"
print (foo (read "7.2")) -- prints "14.2"
简而言之,默认规则是“尝试做正确的事情”的一种尝试,当您的程序中有不明确的类型时,您可以避免编译错误。不幸的是,在这种情况下,它将编译时错误换成了运行时错误。
您可以像这样禁用默认设置:
default ()
这将迫使您通过类型注释明确消除此类术语的类型:
print (foo (read "7" :: Int))
关于haskell - 为什么 Haskell 在读取 Num 时似乎默认读取 Int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165049/