在Haskell中,我可以默认使数字文字不是多态的吗?

时间:2011-07-25 06:49:46

标签: haskell types literals

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

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

(我之所以喜欢这种行为,是因为它使得错误消息更加清晰,类型推断更有可能(特别是类型类)。我总是可以写(2 :: Int)到处但是我宁愿“更安全”的行为是不太明确的行为)

2 个答案:

答案 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类型的参数(实际上,即使这不是必需的,但如果不是这样,你将从数字文字中得到类型错误。)

请注意,因为标准fromIntegerNum类的一部分,所以您可能需要修改一些内容才能使事情正常运行。

答案 1 :(得分:4)

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

给出
 default (Integer, Double)

并且可以更改,例如通过推荐

 default (Int)

 default ()

在源文件中。