От GHC документите:
„повдигнат“ тип означава, че термини от този тип може да са най-ниски.
„боксиран“ тип означава, че дадена стойност е представена от указател към куп обект.
Някои последици включват:
- Повдигнатият тип е в кутия (но не непременно по друг начин - вижте връзката по-горе за повече)
- Типовете без кутия не могат да имат thunks (тъй като те са указатели към данни, които ви казват как да създадете стойността), така че без мързел. Те наистина държат само ценности. Това също означава, че те могат да бъдат по-бързи.
- Полиморфизмът не играе с неповдигнати типове. Всеки път, когато видите променлива тип, всички включени типове не се повдигат. Нещо като
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