我是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默认在这种情况下?
答案 0 :(得分:7)
GHC也会输入类型 - 默认值,至少每当你导出一个模块时,它都会将任何模糊数字类型单一化为模块的default
类型中的类型,默认为:
default (Integer, Double)
请参阅Haskell specification中的“4.3.4模糊类型和重载数值运算的默认值”部分。
您可以使用 toplevel 数字多态类型保留的模块中的pragma {-# LANGUAGE NoMonomorphismRestriction #-}
禁用此功能。
答案 1 :(得分:0)
我猜测default
关键字?
它允许您指定在未给出签名时使用的内容。还有一个"默认"默认值,即Double
。
我完全忘记了所有这些是如何工作的;它是语言中一个相当模糊的角落......