GHC.Exts
| Copyright | (c) The University of Glasgow 2002 |
|---|---|
| License | see libraries/base/LICENSE |
| Maintainer | cvs-ghc@haskell.org |
| Stability | internal |
| Portability | non-portable (GHC Extensions) |
| Safe Haskell | Unsafe |
| Language | Haskell2010 |
Содержание
- Представления некоторых базовых типов
- Максимальный размер кортежа
- Примитивные операции
- Фьюжн
- Перегруженные строковые литералы
- Отладка
- Идентификаторы со специальным поведением
- Безопасные приведения типов
- Преобразование comprehensions
- Журналирование событий
- Аннотации SpecConstr
- Стек вызова
- Тип Constraint
- Перегруженные списки
Описание
GHC Extensions: это утвержденный способ доступа к расширениям, специфичным для GHC.
Примечание: ни один другой базовый модуль не должен импортировать этот модуль.
Представления некоторых базовых типов
Целочисленный тип с фиксированной точностью, имеющий диапазон не менее [-2^29 .. 2^29-1]. Точный диапазон для данной реализации может быть определен с помощью minBound и maxBound из класса Bounded.
Экземпляры
Word — это беззнаковый целочисленный тип того же размера, что и Int.
Экземпляры
Числа с плавающей точкой одинарной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE одинарной точности.
Экземпляры
Числа с плавающей точкой двойной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE двойной точности.
Примеры использования
Тип символов Char — это перечисление, значения которого представляют символы Юникода (или, равнозначно, ISO/IEC 10646). (Подробнее см. http://www.unicode.org/). Этот набор расширяет набор символов ISO 8859-1 (Latin-1) (первые 256 символов), который в свою очередь является расширением набора символов ASCII (первые 128 символов). Литерал символа в Haskell имеет тип Char.
Для преобразования Char в соответствующее значение Int, определённое в Юникоде, используйте методы toEnum и fromEnum соответственно из класса Enum (или эквивалентно ord и chr).
Примеры использования
Значение типа Ptr a представляет указатель на объект или массив объектов, которые могут быть обработаны для использования в Haskell-значениях типа a.
Тип a часто будет экземпляром класса Storable, предоставляющего операции обработки. Однако это необязательно, и вы можете предоставить свои собственные операции для доступа к указателю. Например, вы можете написать небольшие внешние функции для получения или установки полей C struct.
Примеры использования
data Функциональный указатель a Источник
Значение типа FunPtr a — это указатель на функцию, вызываемую из внешнего кода. Тип a обычно является внешним типом, типом функции с нулем или более аргументами, где
- типы аргументов являются обрабатываемыми внешними типами, т. е.
Char,Int,Double,Float,Bool,Int8,Int16,Int32,Int64,Word8,Word16,Word32,Word64,Ptr a,FunPtr a,StablePtr aили переименования любого из них с использованиемnewtype. - тип возвращаемого значения либо является обрабатываемым внешним типом, либо имеет вид
IO t, гдеt— это обрабатываемый внешний тип или().
Значение типа FunPtr a может быть указателем на внешнюю функцию, возвращённой другой внешней функцией или импортированной со статическим адресом импорта, как
foreign import ccall "stdlib.h &free" p_free :: FunPtr (Ptr a -> IO ())
или указателем на Haskell-функцию, созданную с использованием обёртки-заглушки, объявленной для создания FunPtr нужного типа. Например:
type Compare = Int -> Int -> Bool foreign import ccall "wrapper" mkCompare :: Compare -> IO (FunPtr Compare)
Вызовы заглушек-обёртки, таких как mkCompare , выделяют память, которую необходимо освободить с помощью freeHaskellFunPtr , когда она больше не нужна.
Для преобразования значений FunPtr в соответствующие Haskell-функции можно определить динамическую заглушку для конкретного внешнего типа, например
type IntFunction = CInt -> IO () foreign import ccall "dynamic" mkFun :: FunPtr IntFunction -> IntFunction
Конструкторы
| Функциональный указатель Addr# |
Примеры использования
Максимальный размер кортежа
maxTupleSize :: Целое число Источник
Примитивные операции
module GHC.Prim
shiftL# :: Word# -> Int# -> Word# Источник
Сдвигает аргумент влево на указанное количество битов (которое должно быть неотрицательным).
shiftRL# :: Word# -> Int# -> Word# Источник
Сдвигает аргумент вправо на указанное количество битов (которое должно быть неотрицательным). RL означает «вправо, логический» (в отличие от RA для арифметического) (хотя арифметический сдвиг вправо не имеет смысла для Word#).
iShiftL# :: Int# -> Int# -> Int# Источник
Сдвигает аргумент влево на указанное количество битов (которое должно быть неотрицательным).
iShiftRA# :: Int# -> Int# -> Int# Источник
Сдвигает аргумент вправо (знаковый) на указанное количество битов (которое должно быть неотрицательным). RA означает «вправо, арифметическое» (в отличие от RL для логического).
iShiftRL# :: Int# -> Int# -> Int# Источник
Сдвигает аргумент вправо (беззнаковый) на указанное количество битов (которое должно быть неотрицательным). RL означает «вправо, логический» (в отличие от RA для арифметического).
uncheckedShiftL64# :: Word# -> Int# -> Word# Источник
uncheckedShiftRL64# :: Word# -> Int# -> Word# Источник
uncheckedIShiftL64# :: Int# -> Int# -> Int# Источник
uncheckedIShiftRA64# :: Int# -> Int# -> Int# Источник
isTrue# :: Int# -> Bool Источник
Псевдоним для tagToEnum#. Возвращает True, если его параметр равен 1#, и False, если он равен 0#.
Фьюжн
build :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a] Источник
Производитель списков, который может быть объединен с foldr. Эта функция просто
build g = g (:) []
но упроститель GHC преобразует выражение вида foldr k z (build g), которое может возникнуть после подстановки, в g k z, что позволяет избежать создания промежуточного списка.
augment :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a] -> [a] Источник
Производитель списков, который может быть объединен с foldr. Эта функция просто
augment g xs = g (:) xs
но упроститель GHC преобразует выражение вида foldr k z (augment g xs), которое может возникнуть после подстановки, в g k (foldr k z xs), что позволяет избежать создания промежуточного списка.
Перегруженные строковые литералы
class IsString a where Источник
Класс для структур данных, подобных строкам; используется расширением перегруженных строк (-XOverloadedStrings в GHC).
Методы
fromString :: String -> a Источник
Отладка
breakpoint :: a -> a Источник
breakpointCond :: Bool -> a -> a Источник
Идентификаторы со специальным поведением
Функция lazy немного ограничивает анализ строгости. Вызов lazy e означает то же, что и e, но lazy имеет магическое свойство в отношении анализа строгости: он ленив в своем первом аргументе, несмотря на то, что его семантика строго определена. После выполнения анализа строгости вызовы к lazy встраиваются в функцию тождества.
Это поведение иногда полезно при управлении порядком вычислений. В частности, lazy используется в определении библиотеки par:
par :: a -> b -> b par x y = case (par# x) of _ -> lazy y
Если lazy не был бы ленивым, par казался бы строго связанным с y, что свело бы на нет весь смысл par.
Как и seq, аргумент lazy может иметь неявный тип.
Вызов inline f обеспечивает, что f будет внедрен, независимо от его размера. Точнее, вызов inline f переписывается на правой стороне определения f. Это позволяет программисту управлять встраиванием с конкретной точки вызова, а не из места определения функции (ср. директивы INLINE).
Это встраивание происходит независимо от аргумента вызова или размера определения f; оно безусловное. Главное замечание состоит в том, что определение f должно быть видно компилятору; поэтому рекомендуется пометить функцию директивой INLINABLE в ее определении, чтобы GHC гарантировал сохранение ее развертывания независимо от размера.
Если встраивание не происходит, функция inline расширяется до функции тождества на нулевой фазе, поэтому ее использование не накладывает дополнительной нагрузки.
Безопасные преобразования типов
Эти преобразования также доступны из модуля Надежные Data.Coerce.
С: 4.7.0.0
Функция coerce позволяет безопасно преобразовывать значения между типами, имеющими одинаковое представление без затрат во время выполнения. В простейшем случае её можно использовать вместо конструктора newtype, чтобы перейти от конкретного типа newtype к абстрактному типу. Но она также работает и в более сложных ситуациях, например, при преобразовании списка newtype в список конкретных типов.
Этот класс с двумя параметрами имеет экземпляры для типов a и b если компилятор может определить, что они имеют одинаковое представление. Этот класс не имеет обычных экземпляров; вместо этого они создаются динамически во время проверки типов. Попытка вручную объявить экземпляр Coercible является ошибкой.
Тем не менее, можно предположить, что существуют следующие три вида экземпляров. Во-первых, как тривиальный базовый случай:
instance a a
Кроме того, для каждого конструктора типа существует экземпляр, который позволяет производить приведение типов под конструктором типа. Например, пусть D будет прототипическим конструктором типа (data или newtype) с тремя аргументами типа, которые имеют роли nominal, representational соответственно phantom. Тогда существует экземпляр в виде
instance Coercible b b' => Coercible (D a b c) (D a b' c')
Обратите внимание, что аргументы типа nominal равны, аргументы типа representational могут отличаться, но должны иметь экземпляр Coercible сами по себе, а аргументы типа phantom могут быть изменены произвольно.
Третий вид экземпляра существует для каждого newtype NT = MkNT T и представлен в двух вариантах:
instance Coercible a T => Coercible a NT
instance Coercible T b => Coercible NT b
Этот экземпляр можно использовать только в том случае, если конструктор MkNT находится в области видимости.
Если, как автор библиотеки конструктора типа, например, Set a, вы хотите предотвратить использование пользователем вашего модуля запись coerce :: Set T -> Set NT, необходимо установить роль параметра типа Set в nominal, написав
type role Set nominal
Для получения более подробной информации об этой функции обратитесь к статье Safe Coercions Йоахима Брейтнера, Ричарда Э. Айзенберга, Саймона Пейтона Джонса и Стефани Вейрих.
С версии: 4.7.0.0
Преобразование включений
Тип Down позволяет удобно изменять порядок сортировки. Значение типа Down a содержит значение типа a (представленное как Down a). Если для a существует экземпляр Ord, сравнение двух обернутых таким образом значений даст обратный порядок сортировки по сравнению с их обычным порядком. Это особенно полезно при сортировке в обобщенных списках включений, как в: then sortWith by Down x
Предоставляет экземпляры Show и Read (с версии: 4.7.0.0).
С версии: 4.6.0.0
Конструкторы
| Down a |
Экземпляры
groupWith :: Ord b => (a -> b) -> [a] -> [[a]] Источник
Функция groupWith использует предоставленную пользователем функцию, которая проектирует элемент из каждого элемента списка, чтобы сначала отсортировать входной список, а затем сгруппировать элементы по равенству этих спроектированных элементов.
sortWith :: Ord b => (a -> b) -> [a] -> [a] Источник
Функция sortWith сортирует список элементов, используя предоставленную пользователем функцию для проекции чего-либо из каждого элемента.
the :: Eq a => [a] -> a Источник
the гарантирует, что все элементы списка идентичны, и затем возвращает этот уникальный элемент.
Ведение журнала событий
traceEvent :: String -> IO () Источник
Устарело: Используйте traceEvent или traceEventIO
Аннотации SpecConstr
тип данных SpecConstrAnnotation Источник
Конструкторы
| NoSpecConstr | |
| ForceSpecConstr |
Экземпляры
Стек вызовов
currentCallStack :: IO [String] Источник
Возвращает '[String]', представляющий текущий стек вызовов. Это может быть полезно для отладки.
Реализация использует симуляцию стека вызовов, поддерживаемую профайлером, поэтому она работает только если программа была скомпилирована с -prof и содержит соответствующие аннотации SCC (например, используя -fprof-auto). В противном случае возвращаемый список, скорее всего, будет пустым или неинформативным.
С версии: 4.5.0.0
Вид ограничения
тип данных Constraint :: BOX Источник
Перегруженные списки
Класс IsList и его методы предназначены для использования совместно с расширением OverloadedLists.
С версии: 4.7.0.0
Методы
fromList :: [Item l] -> l Источник
Функция fromList строит структуру l из заданного списка Item l.
fromListN :: Int -> [Item l] -> l Источник
Функция fromListN принимает длину входного списка как подсказку. Её поведение должно быть эквивалентно fromList. Подсказка может быть использована для построения структуры l более эффективно по сравнению с fromList. Если заданная подсказка не равна длине входного списка, поведение fromListN не определено.
toList :: l -> [Item l] Источник
Функция toList извлекает список Item l из структуры l. Она должна удовлетворять условию fromList . toList = id.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/GHC-Exts.html