В отчете Haskell 2010 в разделе 6.4.1 написано
Целочисленный литерал представляет применение функции fromInteger
к соответствующему значению типа Integer
.
* 1008. * Как выглядит это «подходящее значение»? Могу ли я написать это в исходном 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
.
Я думаю об этом относительно newtype
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
с?
Дополнительный q для newtype
с: поскольку я могу написать z = (4 + 5 :: Age)
, действительно ли необходим конструктор MkAge
?
mkAge2 :: Age -> Age
mkAge2 = id
w = mkAge2 4
mkAge3 :: Integer -> Age
mkAge3 = fromInteger
u = mkAge3 4
кажется, работает так же хорошо, если я хочу что-то префикс.