haskell - 为什么基本 Prelude 算术不需要显式类型?

标签 haskell ghc

我是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 中有任何内容。显然都是FloatDouble在这里将是有效的选择,为什么 GHC 选择一个而不是另一个?默认是什么类型,为什么(大概)GHC 在这种情况下默认?

最佳答案

GHC 也进行类型默认,至少每当您导出模块时,它会将任何模棱两可的数字类型单态化为 default 中的类型。模块的类型,默认为:

default (Integer, Double)

请参阅 Haskell specification 中的“4.3.4 重载数值运算的歧义类型和默认值”一节。 .

您可以使用编译指示 {-# LANGUAGE NoMonomorphismRestriction #-} 禁用它。在要导出的模块中使用 顶层 数字多态类型保持不变。

关于haskell - 为什么基本 Prelude 算术不需要显式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21943624/

相关文章:

haskell : unload module in WinGHCi

haskell - 使用 IO.readLn 从 Haskell 中的标准输入读取单行

multithreading - 限制 GHC 中每个线程的线程内存访问

haskell - 杀死 Windows 上的 runhaskell 进程

haskell - 使用 Vim 在文本换行上自动继续 Haskell 注释中的前导破折号

haskell - 表示有限(非递归)代数类型值的最有效方法是什么?

haskell - 类型导向的测试生成

haskell - 我们可以在 Haskell 中调整 "a -> a"函数吗?

python - 为什么这个斐波那契在 Python 中的计算速度比 Haskell 快得多

haskell - 是否有类似于函数式编程的循环展开的优化?