为什么基本的Prelude算法不需要显式类型?

cro*_*eea 6 haskell ghc

我正在回答一个问题并写了一些代码来完成工作.

isPrime :: Int -> Bool
isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)
Run Code Online (Sandbox Code Playgroud)

我假设需要显式类型签名,如我的回答所述.然后我检查两个GHC和GHCI,发现我并没有需要转换的显式类型,尽管floorsqrt是多态的.我知道GHCi确实做了某种类型的默认,但我在GHC中并不知道.显然,双方FloatDouble会有效的选择在这里,为什么GHC选择了另一种?什么类型是默认的,为什么(大概)GHC默认在这种情况下?

Ste*_*ehl 7

GHC也会输入类型 - 默认值,至少每当你导出一个模块时,它都会将任何模糊数字类型单一化为模块类型中的default类型,默认为:

default (Integer, Double)
Run Code Online (Sandbox Code Playgroud)

请参阅Haskell规范中的"4.3.4模糊类型和重载数值运算的默认值"部分.

您可以使用{-# LANGUAGE NoMonomorphismRestriction #-}要导出的模块中的pragma禁用此功能,并保持完整的顶级数字多态类型.