这可能是不可能的,因为我已经检查了所有GHC扩展的列表,但这不在那里,但我想我会问以防万一。
有没有办法让2
类型Int
(或Integer
)而不是通常Num a => a
?
(我之所以喜欢这种行为,是因为它使得错误消息更加清晰,类型推断更有可能(特别是类型类)。我总是可以写(2 :: Int)到处但是我宁愿“更安全”的行为是不太明确的行为)
答案 0 :(得分:14)
使用GHC扩展有一种(略显侮辱和不方便)的方法。
{-# LANGUAGE RebindableSyntax #-}
import qualified Prelude as P
import Prelude hiding (Num(..))
fromInteger :: Integer -> Integer
fromInteger = id
在GHCi中:
> :set -XRebindableSyntax
> :t 2
2 :: Integer
启用RebindindableSyntax
扩展名后,GHC将使用范围内的fromInteger
来处理数字文字。唯一的限制是它必须采用Integer
类型的参数(实际上,即使这不是必需的,但如果不是这样,你将从数字文字中得到类型错误。)
请注意,因为标准fromInteger
是Num
类的一部分,所以您可能需要修改一些内容才能使事情正常运行。
答案 1 :(得分:4)
我想我应该在这些答案中添加“default()”,尽管我认为gatoatigrado顺便提到了它。 Haskell 98标准有section 4.3.4,它最终描述了如何改变 Num a =>的某些默认值。一个值。隐含的违约顺序由
给出 default (Integer, Double)
并且可以更改,例如通过推荐
default (Int)
或
default ()
在源文件中。