我是answering a question并编写了一些代码来完成工作。
isPrime :: Int -> Bool
isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)
我假设需要显式类型签名,如我的回答中所述。然后我在 GHC 和 GHCi 中检查了它,发现尽管
floor
我不需要显式类型进行转换。和 sqrt
是多态的。我知道GHCi does does some type defaulting ,但我不知道 GHC 中有任何内容。显然都是Float
和 Double
在这里将是有效的选择,为什么 GHC 选择一个而不是另一个?默认是什么类型,为什么(大概)GHC 在这种情况下默认?
最佳答案
GHC 也进行类型默认,至少每当您导出模块时,它会将任何模棱两可的数字类型单态化为 default
中的类型。模块的类型,默认为:
default (Integer, Double)
请参阅 Haskell specification 中的“4.3.4 重载数值运算的歧义类型和默认值”一节。 .
您可以使用编译指示
{-# LANGUAGE NoMonomorphismRestriction #-}
禁用它。在要导出的模块中使用 顶层 数字多态类型保持不变。
关于haskell - 为什么基本 Prelude 算术不需要显式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21943624/