Тип двойной
Изучение Хаскелла, в ghci
:
Prelude Data.Ratio> :type 0.15
0.15 :: Fractional a => a
Prelude Data.Ratio> 0.15
0.15
it :: Double
Почему типы разные? Эти два экземпляра 0.15 на самом деле разные типы?
1 ответ
Это связано с ужасным ограничением мономорфизма. По сути, GHCi любит выбирать типы по умолчанию при выполнении (по умолчанию Fractional
тип Double
), но когда вы спрашиваете тип с помощью :type
он выбирает самую общую версию. Вы можете отключить это поведение с помощью NoMonomorphismRestriction
расширение:
> :set -XNoMonomorphismRestriction
> :set +t
> 0.15
0.15
it :: Fractional a => a
> :t 0.15
0.15 :: Fractional a => a
Хотя это расширение имеет одно из самых страшных названий, оно довольно просто, когда вы его разбиваете:
Mono -> One
Morph -> shape (type)
ism -> thingy
Monomorphism -> one shape thingy -> one type thingy -> thing with a single type
В общем, это действительно длинное слово, означающее "один тип". Затем с помощью "ограничения" вы получите, что ограничение мономорфизма ограничивает вещи одним типом. В этом случае это ограничивает числа (вещи) для типа Double
, Без этого ограничения тип чисел ограничен только классом типов, который теоретически может быть бесконечным числом типов.