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

时间:2014-02-21 19:36:03

标签: haskell ghc

我是answering a question并写了一些代码来完成工作。

isPrime :: Int -> Bool
isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)

我认为需要显式类型签名,如我的回答所述。然后我在GHC和GHCi中检查了它,发现虽然floorsqrt是多态的,但我需要转换的显式类型。我知道GHCi does does some type defaulting,但我在GHC中并不知道。显然,FloatDouble在这里都是有效的选择,为什么GHC选择一个而不是另一个?什么类型是默认的,为什么(大概)GHC默认在这种情况下?

2 个答案:

答案 0 :(得分:7)

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

default (Integer, Double)

请参阅Haskell specification中的“4.3.4模糊类型和重载数值运算的默认值”部分。

您可以使用 toplevel 数字多态类型保留的模块中的pragma {-# LANGUAGE NoMonomorphismRestriction #-}禁用此功能。

答案 1 :(得分:0)

我猜测default关键字?

它允许您指定在未给出签名时使用的内容。还有一个"默认"默认值,即Double

我完全忘记了所有这些是如何工作的;它是语言中一个相当模糊的角落......