gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:57:47 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com