在Haskell中,我可以使数值文本在默认情况下不具有多态性吗?

在Haskell中,我可以使数值文本在默认情况下不具有多态性吗?,haskell,types,literals,Haskell,Types,Literals,这可能是不可能的,因为我已经检查了所有GHC扩展的列表,但这不在其中,但我想我会问以防万一 有没有办法使2的类型为Int(或Integer)而不是通常的Num a=>a (我喜欢这种行为的原因是它使错误消息更清晰,类型推断更可能(特别是使用类型类)。我总是可以在任何地方编写(2::Int),但我更希望“更安全”的行为不那么明确)有一种(稍微滥用和不方便的)方法使用GHC扩展来实现这一点 {-# LANGUAGE RebindableSyntax #-} import qualified Pre

这可能是不可能的,因为我已经检查了所有GHC扩展的列表,但这不在其中,但我想我会问以防万一

有没有办法使
2
的类型为
Int
(或
Integer
)而不是通常的
Num a=>a

(我喜欢这种行为的原因是它使错误消息更清晰,类型推断更可能(特别是使用类型类)。我总是可以在任何地方编写(2::Int),但我更希望“更安全”的行为不那么明确)

有一种(稍微滥用和不方便的)方法使用GHC扩展来实现这一点

{-# LANGUAGE RebindableSyntax #-}

import qualified Prelude as P
import Prelude hiding (Num(..))

fromInteger :: Integer -> Integer
fromInteger = id
在GHCi中:

> :set -XRebindableSyntax
> :t 2
2 :: Integer
启用
reBindinableSyntax
扩展后,GHC将使用范围内的
fromInteger
来处理数字文本。唯一的限制是,它必须接受类型为
Integer
的参数(实际上,即使这样也不是必需的,但如果不这样做,您将从数字文本中得到一个类型错误)

请注意,因为标准的
fromInteger
Num
类的一部分,您可能需要修改一些东西才能使其正常工作。

我认为我应该在这些答案中添加“default()”,尽管我认为gatoatigrado顺便提到了它。Haskell 98标准有一个最终描述了如何更改Num a=>a值的一些默认值。隐式默认顺序由

 default (Integer, Double)
并且可以更改,例如,通过

 default (Int)


在源文件中。

是的,不要这样做:)类型推断通常没有那么糟糕。也许如果你发布一个问题示例,人们可以用不同的方式帮助你解决它?您可以通过设置默认值。您还可以通过将顶层函数的类型设置为
f=undefined::DesiredType
,并适当地清除它们来开发顶层函数的原型。多态常量不会阻止我做任何事情,但它们确实会降低错误消息的直接性,通常会将“无法匹配预期类型…”更改为“无实例…”. 另外,默认设置通常不允许您推断类的实例(感觉有点像黑客)。嗯,也许最好只隐藏
fromInteger
导入前奏隐藏(Num(fromInteger))
谢谢!我测试了这个,它确实得到了我想要的行为。。。虽然有点罗嗦(这也让算术不方便,但我从来都不做算术)。@luqui:也许吧。我不确定如果只隐藏,那么使用
Num
@Owen中的其他函数会产生奇怪的结果:你可以试试luqui的建议。我有点笨手笨脚,完全隐藏
Num
,可能没有必要。@Owen:如果你不做算术,那么你需要数字做什么?
 default ()