Тип двойной

Изучение Хаскелла, в 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, Без этого ограничения тип чисел ограничен только классом типов, который теоретически может быть бесконечным числом типов.

Другие вопросы по тегам