Haskell 2010报告第6.4.1节说
整数文字表示将函数
fromInteger
应用到类型Integer
的适当值。
“适当的值”是什么样的?我可以在源代码Haskell中编写它吗?我当然可以写
x :: Integer
x = 4
但是那个等式等于
x = (fromInteger 4) :: Integer
编辑:避免无限回归,应该是
x = (fromInteger 4?) :: Integer
其中4?
是类型4
上的神秘值Integer
。
因此它选择了Integer
的fromInteger
重载。文字的类型(在原始x = 4
中)仍然是4 :: Num a => a
,而不是Integer
。
我正在考虑此wrtnewtype
s:
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
newtype Age = MkAge Int deriving (Num, Eq, Ord, Show)
-- fromInteger is in Num
y :: Age
y = 4
z = (4 + 5 :: Age) -- no decl for z, inferred :: Age
[如果我询问show y
,我会看到MkAge 4
;如果我问show x
,我会看到普通的4
。那么Integer
是否有一些不可见的构造函数?
newtype
的补充q:因为我可以写z = (4 + 5 :: Age)
,所以构造函数MkAge
真的必要吗?
mkAge2 :: Age -> Age
mkAge2 = id
w = mkAge2 4
mkAge3 :: Integer -> Age
mkAge3 = fromInteger
u = mkAge3 4
如果我想要一些前缀,似乎也可以正常工作。
4 :: Integer
是这样的值; 4 :: Int
不是。不要将文字4
与它在源代码中表示的实际值系列混淆。
4
本身具有多态类型Num a => a
,这意味着在正确的上下文中,您可以从中“提取”一个类型为4 :: Integer
的值。这样的上下文是对fromInteger
的调用,因为它希望将Integer
类型的值作为参数,而不是Num a => a
类型的值。