haskell - 为什么 Haskell 在读取 Num 时似乎默认读取 Int?

标签 haskell typeclass

我没想到以下代码可以工作:

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/

相关文章:

haskell - 封闭类型类是否足以推断关联类型(没有类型族)?

haskell - 对透镜类型进行抽象以提供更好的属性读写控制

haskell - 为什么读取不能推导出正确的类型?

haskell - 使用 Haskell 组时遇到问题

forms - 我可以在输入表单中有一个文件字段吗?

haskell - haskell 中的关联数据类型是什么?

haskell - 为什么 GHC 会在这里产生等式约束错误而不是类型匹配错误?

sql - 在Haskell中进行部分SQL插入

haskell - 接口(interface)抽象设计

scala - 使用类型类建模生产者-消费者语义?