Spec-Zone.ru › Haskell 7

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.

Примечание: ни один другой базовый модуль не должен импортировать этот модуль.

Представления некоторых базовых типов

data Int :: * Source

Целочисленный тип с фиксированной точностью, имеющий диапазон не менее [-2^29 .. 2^29-1]. Точный диапазон для данной реализации может быть определен с помощью minBound и maxBound из класса Bounded.

Конструкторы

I# Int#

Экземпляры

Bounded Int
Enum Int
Eq Int
Integral Int
Data Int
Num Int
Ord Int
Read Int
Real Int
Show Int
Ix Int
Generic Int
FiniteBits Int
Bits Int
Storable Int
PrintfArg Int
type Rep Int

data Word :: * Source

Word — это беззнаковый целочисленный тип того же размера, что и Int.

Конструкторы

W# Word#

Экземпляры

Bounded Word
Enum Word
Eq Word
Integral Word
Data Word
Num Word
Ord Word
Read Word
Real Word
Show Word
Ix Word
FiniteBits Word
Bits Word
Storable Word
PrintfArg Word

data Float :: * Source

Числа с плавающей точкой одинарной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE одинарной точности.

Конструкторы

F# Float#

Экземпляры

Eq Float
Floating Float
Data Float
Ord Float
Read Float
RealFloat Float
Generic Float
Storable Float
PrintfArg Float
type Rep Float

data Double :: * Source

Числа с плавающей точкой двойной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE двойной точности.

Конструкторы

D# Double#

Примеры использования

Eq Double
Floating Double
Data Double
Ord Double
Read Double
RealFloat Double
Generic Double
Storable Double
PrintfArg Double
type Rep Double

data Символ :: * Источник

Тип символов 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).

Конструкторы

C# Char#

Примеры использования

Ограниченный Символ
Перечисление Символ
Eq Символ
Data Символ
Ord Символ
Read Символ
Show Символ
Ix Символ
Generic Символ
Storable Символ
IsChar Символ
PrintfArg Символ
IsString [Символ]
type Rep Символ

data Указатель a Источник

Значение типа Ptr a представляет указатель на объект или массив объектов, которые могут быть обработаны для использования в Haskell-значениях типа a.

Тип a часто будет экземпляром класса Storable, предоставляющего операции обработки. Однако это необязательно, и вы можете предоставить свои собственные операции для доступа к указателю. Например, вы можете написать небольшие внешние функции для получения или установки полей C struct.

Конструкторы

Указатель Addr#

Примеры использования

Eq (Указатель a)
(Data a, Typeable * a) => Data (Указатель a)
Ord (Указатель a)
Show (Указатель a)
Storable (Указатель a)

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#

Примеры использования

Eq (Функциональный указатель a)
Ord (Функциональный указатель a)
Show (Функциональный указатель a)
Storable (Функциональный указатель a)

Максимальный размер кортежа

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 Источник

Примеры

IsString [Char]

Отладка

breakpoint :: a -> a Источник

breakpointCond :: Bool -> a -> a Источник

Идентификаторы со специальным поведением

lazy :: 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 :: a -> a Источник

Вызов inline f обеспечивает, что f будет внедрен, независимо от его размера. Точнее, вызов inline f переписывается на правой стороне определения f. Это позволяет программисту управлять встраиванием с конкретной точки вызова, а не из места определения функции (ср. директивы INLINE).

Это встраивание происходит независимо от аргумента вызова или размера определения f; оно безусловное. Главное замечание состоит в том, что определение f должно быть видно компилятору; поэтому рекомендуется пометить функцию директивой INLINABLE в ее определении, чтобы GHC гарантировал сохранение ее развертывания независимо от размера.

Если встраивание не происходит, функция inline расширяется до функции тождества на нулевой фазе, поэтому ее использование не накладывает дополнительной нагрузки.

Безопасные преобразования типов

Эти преобразования также доступны из модуля Надежные Data.Coerce.

С: 4.7.0.0

coerce :: Coercible * a b => a -> b Источник

Функция coerce позволяет безопасно преобразовывать значения между типами, имеющими одинаковое представление без затрат во время выполнения. В простейшем случае её можно использовать вместо конструктора newtype, чтобы перейти от конкретного типа newtype к абстрактному типу. Но она также работает и в более сложных ситуациях, например, при преобразовании списка newtype в список конкретных типов.

класс Coercible a b Источник

Этот класс с двумя параметрами имеет экземпляры для типов 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

Преобразование включений

newtype Down a Источник

Тип 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

Экземпляры

Eq a => Eq (Down a)
Ord a => Ord (Down a)
Read a => Read (Down a)
Show a => Show (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

Экземпляры

Eq SpecConstrAnnotation
Data SpecConstrAnnotation

Стек вызовов

currentCallStack :: IO [String] Источник

Возвращает '[String]', представляющий текущий стек вызовов. Это может быть полезно для отладки.

Реализация использует симуляцию стека вызовов, поддерживаемую профайлером, поэтому она работает только если программа была скомпилирована с -prof и содержит соответствующие аннотации SCC (например, используя -fprof-auto). В противном случае возвращаемый список, скорее всего, будет пустым или неинформативным.

С версии: 4.5.0.0

Вид ограничения

тип данных Constraint :: BOX Источник

Перегруженные списки

класс IsList l Источник

Класс IsList и его методы предназначены для использования совместно с расширением OverloadedLists.

С версии: 4.7.0.0

Минимальное полное определение

fromList, toList

Связанные типы

тип Item l Источник

Функция типа Item возвращает тип элементов структуры l.

Методы

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.

Экземпляры

IsList Version

С версии: 4.8.0.0

IsList [a]

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API