Haskell 为什么基本前奏算术不需要显式类型?

Haskell 为什么基本前奏算术不需要显式类型?,haskell,ghc,Haskell,Ghc,我很忙,写了一些代码来完成这项工作 isPrime :: Int -> Bool isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double) 我假设需要显式类型签名,正如我在回答中解释的那样。然后我在GHC和GHCi中检查了它,发现尽管floor和sqrt是多态的,但我不需要显式类型进行转换。我知道,但我不知道GHC有什么。显然,Float和Double在这里都是有效的选择,为什么GHC会选择其中一个呢?默认为

我很忙,写了一些代码来完成这项工作

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

我假设需要显式类型签名,正如我在回答中解释的那样。然后我在GHC和GHCi中检查了它,发现尽管
floor
sqrt
是多态的,但我不需要显式类型进行转换。我知道,但我不知道GHC有什么。显然,
Float
Double
在这里都是有效的选择,为什么GHC会选择其中一个呢?默认为哪种类型?在这种情况下(大概)GHC为什么会默认

我猜的是
default
关键字

它允许您指定在没有签名时使用什么。还有一个“默认”默认值,即
Double


我完全忘记了这一切是如何运作的;这是语言中一个相当模糊的角落…

GHC也会进行类型默认,至少当您导出模块时,它会将任何不明确的数字类型单形化为模块的
default
类型,默认为:

default (Integer, Double)
请参阅中的“4.3.4不明确类型和重载数值操作的默认值”一节


您可以在想要导出的模块中使用pragma
{-#LANGUAGE NoMonomorphismRestriction#-}
禁用此功能,并保留顶级数值多态类型。

这意味着它实际上是Haskell允许这种魔法,而不仅仅是一些GHC黑客(如GHCi中的默认值)@Eric,我理解是的。但是只适用于
Num
Eq
(AFAIR)。这个关键词理论上可以应用于任何地方,对吗?它不特定于
Num
Eq
?默认机制特定于
Num
Num
的所有子类,
Num
在类型检查器中具有特殊状态。还有一种重载字符串文本的机制非常相似,但是默认情况下它没有打开。我尝试使用了
nomonomomorphismrestriction
,但仍然在
isPrime
中得到默认设置。你是在问如何在模块中的任何地方禁用默认设置吗?我是在问是否有办法禁用
isPrime
的类型默认设置。我尝试将其添加到主文件中,并尝试在两个模块中使用pragma语言导出
isPrime
,但仍然会出现类型默认。为函数编写一个显式多态签名:
isPrime::(积分a,数值a)=>a->Bool
,但该函数不起作用,我也不希望这样:类型转换发生在
isPrime
内部,并且对类型签名/与函数的外部交互“不可见”。我有完全相同的问题!