Из документов GHC а>:
«Поднятый» тип означает, что термины этого типа могут быть нижними.
«упакованный» тип означает, что значение представлено указателем на объект кучи.
Некоторые последствия включают:
- Приподнятый тип упакован в коробку (но не обязательно в другую сторону - подробнее см. ссылку выше)
- Неупакованные типы не могут иметь преобразователь (поскольку это указатели на данные, говорящие вам, как создать значение), так что не ленитесь. Они просто хранят ценности. Это также означает, что они могут быть быстрее.
- Полиморфизм не работает с неподнятыми типами. Всякий раз, когда вы видите переменную типа, все задействованные типы не поднимаются. Что-то вроде
id 0 :: Int#
не работает. Посмотрите этот ответ, чтобы увидеть, как вы можете (начиная с GHC 8.0) иногда обойти это.
Обратите внимание, что вы можете создавать неподнятые продукты в GHC, используя расширения MagicHash
и UnboxedTuples
(хотя я не думаю, что они хорошо работают с GHCi):
{-# LANGUAGE MagicHash, UnboxedTuples #-}
extGCD :: Int -> Int -> (# Int, Int, Int #)
extGCD a 0 = (# 1, 0, a #)
extGCD a b = let (q, r) = a `quotRem` b
(# s, t, g #) = extGCD b r
in (# t, s - q * t, abs g #)
За исключением этого расширения, я считаю, что единственные неподнятые типы, которые вы найдете, находятся в GHC.Exts
и являются примитивными типами. Обсуждается возможность интеграции пользовательских неподнятых типов данных в GHC здесь.
Последнее замечание: в то время как расширенные типы имеют вид *
, неподнятые типы имеют вид #
. Этот ответ на вопрос, указанный в комментариях, содержит более подробную информацию об этом.
person
Alec
schedule
11.10.2016