Предисловие
| Авторские права | (с) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | стабильная |
| Переносимость | переносимая |
| Безопасный Haskell | Надёжный |
| Язык | Haskell2010 |
Содержание
Описание
Предисловие: стандартный модуль. Предисловие импортируется по умолчанию во все модули Haskell, если нет явного указания на импорт или включён расширение NoImplicitPrelude.
Стандартные типы, классы и связанные функции
Основные типы данных
data Bool :: * Исходный код
Экземпляры
(&&) :: Bool -> Bool -> Bool infixr 3 Исходный код
Булево "и"
(||) :: Bool -> Bool -> Bool infixr 2 Исходный код
Булево "или"
not :: Bool -> Bool Исходный код
Булево "не"
otherwise :: Bool Исходный код
otherwise определяется как значение True. Оно помогает сделать условия более читаемыми. Например:
f x | x < 0 = ...
| otherwise = ...
data Maybe a Исходный код
Тип Maybe инкапсулирует необязательное значение. Значение типа Maybe a содержит значение типа a (представленное как Just a) или пустое (представленное как Nothing). Использование Maybe – хороший способ справиться с ошибками или исключительными случаями, не прибегая к радикальным мерам, таким как error.
Тип Maybe также является монадой. Это простой вид монад ошибок, где все ошибки представлены как Nothing. Более богатая монада ошибок может быть построена с помощью типа Either.
Экземпляры
| Монада Maybe | |
| Функтор Maybe | |
| МонадаFix Maybe | |
| Прикладной Maybe | |
| Складываемый Maybe | |
| Переходимый Maybe | |
| Общий1 Maybe | |
| МонадаPlus Maybe | |
| Альтернатива Maybe | |
| Равенство a => Равенство (Maybe a) | |
| Данные a => Данные (Maybe a) | |
| Порядок a => Порядок (Maybe a) | |
| Чтение a => Чтение (Maybe a) | |
| Вывод a => Вывод (Maybe a) | |
| Общий (Maybe a) | |
| Моноид a => Моноид (Maybe a) | Поднятие полугруппы в |
| type Rep1 Maybe | |
| type Представление (Maybe a) | |
| type (==) (Maybe k) a b |
maybe :: b -> (a -> b) -> Maybe a -> b Source
Функция maybe принимает значение по умолчанию, функцию и значение Maybe. Если значение Maybe равно Nothing, функция возвращает значение по умолчанию. В противном случае она применяет функцию к значению внутри Just и возвращает результат.
Примеры
Базовое использование:
>>>maybe False odd (Just 3)True
>>>maybe False odd NothingFalse
Чтение целого числа из строки с использованием readMaybe. Если операция успешна, верните удвоенное целое число; то есть, примените (*2) к нему. Если операция по парсингу целого числа не удалась, верните значение 0 по умолчанию:
>>>import Text.Read ( readMaybe )>>>maybe 0 (*2) (readMaybe "5")10>>>maybe 0 (*2) (readMaybe "")0
Примените show к значению Maybe Int. Если у нас есть Just n, мы хотим показать лежащее в основе значение Int n. Но если у нас есть Nothing, мы возвращаем пустую строку вместо (например) "Nothing":
>>>maybe "" show (Just 5)"5">>>maybe "" show Nothing""
Тип Either представляет значения с двумя возможностями: значение типа Either a b является либо Left a, либо Right b.
Тип Either иногда используется для представления значения, которое либо правильное, либо ошибка; по соглашению, конструктор Left используется для хранения значения ошибки, а конструктор Right используется для хранения правильного значения (мнемоника: «right» также означает «правильно»).
Примеры
Тип Either String Int — это тип значений, которые могут быть либо String, либо Int. Конструктор Left может использоваться только с Strings, а конструктор Right может использоваться только с Ints:
>>>let s = Left "foo" :: Either String Int>>>sLeft "foo">>>let n = Right 3 :: Either String Int>>>nRight 3>>>:type ss :: Either String Int>>>:type nn :: Either String Int
Функция fmap из нашего экземпляра Functor проигнорирует значения Left, но применит предоставленную функцию к значениям, содержащимся в Right:
>>>let s = Left "foo" :: Either String Int>>>let n = Right 3 :: Either String Int>>>fmap (*2) sLeft "foo">>>fmap (*2) nRight 6
Экземпляр Monad для Either позволяет нам объединить несколько действий, которые могут завершиться неудачей, и завершаться неудачей в целом, если любое из отдельных шагов завершилось неудачей. Сначала мы напишем функцию, которая может либо разобрать Int из Char, либо завершиться неудачей.
>>>import Data.Char ( digitToInt, isDigit )>>>:{let parseEither :: Char -> Either String Int parseEither c | isDigit c = Right (digitToInt c) | otherwise = Left "parse error">>>:}
Следующее должно работать, так как и '1', и '2' могут быть распарсены как Int.
>>>:{let parseMultiple :: Either String Int parseMultiple = do x <- parseEither '1' y <- parseEither '2' return (x + y)>>>:}
>>>parseMultipleRight 3
Но следующее должно завершиться неудачей, так как первое действие, где мы пытаемся разобрать 'm' как Int, завершится неудачей:
>>>:{let parseMultiple :: Either String Int parseMultiple = do x <- parseEither 'm' y <- parseEither '2' return (x + y)>>>:}
>>>parseMultipleLeft "parse error"
Экземпляры
| Bifunctor Either | |
| Monad (Either e) | |
| Functor (Either a) | |
| MonadFix (Either e) | |
| Applicative (Either e) | |
| Foldable (Either a) | |
| Traversable (Either a) | |
| Generic1 (Either a) | |
| (Eq a, Eq b) => Eq (Either a b) | |
| (Data a, Data b) => Data (Either a b) | |
| (Ord a, Ord b) => Ord (Either a b) | |
| (Read a, Read b) => Read (Either a b) | |
| (Show a, Show b) => Show (Either a b) | |
| Generic (Either a b) | |
| type Rep1 (Either a) | |
| type Rep (Either a b) | |
| type (==) (Either k k1) a b |
either :: (a -> c) -> (b -> c) -> Either a b -> c Source
Анализ вариантов для типа Either. Если значение Left a, примените первую функцию к a; если Right b, примените вторую функцию к b.
Примеры
Мы создаём два значения типа Either String Int, одно с использованием конструктора Left, а другое — с использованием конструктора Right. Затем мы применяем «either» функцию length (если у нас есть String) или функцию «удвоить» (если у нас есть Int):
>>>let s = Left "foo" :: Either String Int>>>let n = Right 3 :: Either String Int>>>either length (*2) s3>>>either length (*2) n6
Экземпляры
Тип символов 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).
Примеры использования
type Строка = [Символ] Источник
A String представляет собой список символов. Константы строк в Haskell — это значения типа String.
Кортежи
Извлечение первого компонента пары.
Извлечение второго компонента пары.
curry :: ((a, b) -> c) -> a -> b -> c Источник
curry преобразует некаррированную функцию в каррированную.
uncurry :: (a -> b -> c) -> (a, b) -> c Источник
uncurry преобразует каррированную функцию в функцию над парами.
Базовые типы классов
Класс Eq определяет равенство (==) и неравенство (/=). Все основные типы данных, экспортируемые Prelude, являются экземплярами Eq, а Eq можно вывести для любого типа данных, чьи составляющие также являются экземплярами Eq.
Экземпляры
| Eq (f p) => Eq (M1 i c f p) | |
| (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) => Eq (a, b, c, d, e, f) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) => Eq (a, b, c, d, e, f, g) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) => Eq (a, b, c, d, e, f, g, h) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i) => Eq (a, b, c, d, e, f, g, h, i) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j) => Eq (a, b, c, d, e, f, g, h, i, j) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k) => Eq (a, b, c, d, e, f, g, h, i, j, k) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l) => Eq (a, b, c, d, e, f, g, h, i, j, k, l) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | |
| (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) |
class Eq a => Ord a where Source
Класс Ord используется для типов данных с полным порядком.
Экземпляры Ord могут быть получены для любого пользовательского типа данных, составные типы которого принадлежат к Ord. Заявленный порядок конструкторов в объявлении данных определяет порядок в полученных экземплярах Ord. Тип Ordering позволяет определить точный порядок двух объектов с помощью одного сравнения.
Минимальное полное определение: либо compare либо <=. Использование compare может быть более эффективным для сложных типов.
Экземпляры
| Ord CIno | |
| Ord CDev | |
| Ord ThreadStatus | |
| Ord BlockReason | |
| Ord ThreadId | |
| Ord IOMode | |
| Ord Version | |
| Ord Natural | |
| Ord SomeSymbol | |
| Ord SomeNat | |
| Ord Unique | |
| Ord Void | |
| Ord a => Ord [a] | |
| Integral a => Ord (Ratio a) | |
| Ord (Ptr a) | |
| Ord (FunPtr a) | |
| Ord (U1 p) | |
| Ord p => Ord (Par1 p) | |
| Ord a => Ord (Maybe a) | |
| Ord a => Ord (Down a) | |
| Ord a => Ord (Last a) | |
| Ord a => Ord (First a) | |
| Ord a => Ord (Product a) | |
| Ord a => Ord (Sum a) | |
| Ord a => Ord (Dual a) | |
| Ord (ForeignPtr a) | |
| Ord a => Ord (ZipList a) | |
| Ord (Fixed a) | |
| Ord a => Ord (Identity a) | |
| (Ord a, Ord b) => Ord (Either a b) | |
| Ord (f p) => Ord (Rec1 f p) | |
| (Ord a, Ord b) => Ord (a, b) | |
| Ord (Proxy k s) | |
| Ord a => Ord (Const a b) | |
| Ord c => Ord (K1 i c p) | |
| (Ord (f p), Ord (g p)) => Ord ((:+:) f g p) | |
| (Ord (f p), Ord (g p)) => Ord ((:*:) f g p) | |
| Ord (f (g p)) => Ord ((:.:) f g p) | |
| (Ord a, Ord b, Ord c) => Ord (a, b, c) | |
| Ord ((:~:) k a b) | |
| Ord (Coercion k a b) | |
| Ord (f a) => Ord (Alt k f a) | |
| Ord (f p) => Ord (M1 i c f p) | |
| (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f) => Ord (a, b, c, d, e, f) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g) => Ord (a, b, c, d, e, f, g) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) => Ord (a, b, c, d, e, f, g, h) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i) => Ord (a, b, c, d, e, f, g, h, i) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j) => Ord (a, b, c, d, e, f, g, h, i, j) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j, Ord k) => Ord (a, b, c, d, e, f, g, h, i, j, k) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j, Ord k, Ord l) => Ord (a, b, c, d, e, f, g, h, i, j, k, l) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j, Ord k, Ord l, Ord m) => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m) |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n) => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | |
| (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n, Ord o) => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) |
Класс Enum определяет операции над последовательно упорядоченными типами.
Методы enumFrom... используются в Haskell для перевода арифметических последовательностей.
Экземпляры Enum могут быть выведены для любого типа перечисления (типы, у конструкторов которых нет полей). Предполагается, что нулевые конструкторы пронумерованы слева направо fromEnum с 0 по n-1. Дополнительные подробности см. в главе 10 документации Haskell.
Для любого типа, который является экземпляром класса Bounded а также Enum, должны выполняться следующие условия:
- Вызовы
succ maxBoundиpred minBoundдолжны привести к ошибке времени выполнения. -
fromEnumиtoEnumдолжны выдавать ошибку времени выполнения, если значение результата не представимо в типе результата. Например,toEnum 7 :: Bool- это ошибка. -
enumFromиenumFromThenдолжны быть определены с явным ограничением, таким образом:
enumFrom x = enumFromTo x maxBound
enumFromThen x y = enumFromThenTo x y bound
where
bound | fromEnum y >= fromEnum x = maxBound
| otherwise = minBound
Методы
преемник значения. Для числовых типов succ добавляет 1.
предшественник значения. Для числовых типов pred вычитает 1.
Преобразование из Int.
Преобразование в Int. То, что возвращает fromEnum при применении к значению, которое слишком велико для размещения в Int, зависит от реализации.
Используется в Haskell для перевода [n..].
enumFromThen :: a -> a -> [a] Source
Используется в Haskell для перевода [n,n'..].
enumFromTo :: a -> a -> [a] Source
Используется в Haskell для перевода [n..m].
enumFromThenTo :: a -> a -> a -> [a] Source
Используется в Haskell для перевода [n,n'..m].
Примеры
| Enum Bool | |
| Enum Символ | |
| Enum Целое | |
| Enum Int8 | |
| Enum Int16 | |
| Enum Int32 | |
| Enum Int64 | |
| Enum Целое число | |
| Enum Порядок | |
| Enum Word | |
| Enum Word8 | |
| Enum Word16 | |
| Enum Word32 | |
| Enum Word64 | |
| Enum () | |
| Enum GeneralCategory | |
| Enum CUIntMax | |
| Enum CIntMax | |
| Enum CUIntPtr | |
| Enum CIntPtr | |
| Enum CSUSeconds | |
| Enum CUSeconds | |
| Enum CTime | |
| Enum CClock | |
| Enum CSigAtomic | |
| Enum CWchar | |
| Enum CSize | |
| Enum CPtrdiff | |
| Enum CDouble | |
| Enum CFloat | |
| Enum CULLong | |
| Enum CLLong | |
| Enum CULong | |
| Enum CLong | |
| Enum CUInt | |
| Enum CInt | |
| Enum CUShort | |
| Enum CShort | |
| Enum CUChar | |
| Enum CSChar | |
| Enum CChar | |
| Enum IntPtr | |
| Enum WordPtr | |
| Enum Режим поиска | |
| Enum Fd | |
| Enum CRLim | |
| Enum CTcflag | |
| Enum CSpeed | |
| Enum CCc | |
| Enum CUid | |
| Enum CNlink | |
| Enum CGid | |
| Enum CSsize | |
| Enum CPid | |
| Enum COff | |
| Enum CMode | |
| Enum CIno | |
| Enum CDev | |
| Enum IOMode | |
| Enum Естественное число | |
| Enum DoTrace | |
| Enum DoHeapProfile | |
| Enum DoCostCentres | |
| Enum GiveGCStats | |
| Integral a => Enum (Ratio a) | |
| Enum (Fixed a) | |
| Enum (Proxy k s) | |
| (~) k a b => Enum ((:~:) k a b) | |
| Coercible k a b => Enum (Coercion k a b) | |
| Enum (f a) => Enum (Alt k f a) |
class Ограниченный a where Источник
Класс Bounded используется для именования верхних и нижних границ типа. Ord не является надклассом Bounded, так как типы, которые не упорядочены полностью, также могут иметь верхние и нижние границы.
Класс Bounded может быть выведен для любого типа перечисления; minBound — это первый конструктор, указанный в объявлении data, а maxBound — последний. Bounded также может быть выведен для типов данных с одним конструктором, составные типы которых находятся в Bounded.
Экземпляры
Числа
Числовые типы
Целочисленный тип с фиксированной точностью, имеющий по крайней мере диапазон [-2^29 .. 2^29-1]. Точный диапазон для данной реализации можно определить с помощью minBound и maxBound из класса Bounded.
Примеры
Инвариант: Jn# и Jp# используются, если значение не помещается в S#
Полезные свойства, вытекающие из инвариантов:
Примеры
Числа с плавающей точкой одинарной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE одинарной точности.
Примеры использования
Числа с плавающей запятой двойной точности. Желательно, чтобы этот тип был по крайней мере равен по диапазону и точности типу IEEE двойной точности.
Примеры использования
type Рациональное число = Ratio Целое число Источник
Рациональные числа произвольной точности, представленные как отношение двух Integer значений. Рациональное число можно построить, используя оператор %.
data Целочисленное беззнаковое слово :: * Источник
Беззнаковое целочисленное значение с размером, совпадающим с размером Int.
Примеры использования
Числовые классы
Базовый числовой класс.
Методы
(+), (-), (*) :: a -> a -> a infixl 7 *infixl 6 +, - Источник
Унарное отрицание.
Модуль числа.
Знак числа. Функции abs и signum должны удовлетворять закону:
abs x * signum x == x
Для вещественных чисел знак signum равен либо -1 (отрицательный), либо 0 (ноль), либо 1 (положительный).
fromInteger :: Целое число -> a Источник
Преобразование из Integer. Целочисленный литерал представляет применение функции fromInteger к соответствующему значению типа Integer, поэтому такие литералы имеют тип (Num a) => a.
Примеры
| Num Int | |
| Num Int8 | |
| Num Int16 | |
| Num Int32 | |
| Num Int64 | |
| Num Integer | |
| Num Word | |
| Num Word8 | |
| Num Word16 | |
| Num Word32 | |
| Num Word64 | |
| Num CUIntMax | |
| Num CIntMax | |
| Num CUIntPtr | |
| Num CIntPtr | |
| Num CSUSeconds | |
| Num CUSeconds | |
| Num CTime | |
| Num CClock | |
| Num CSigAtomic | |
| Num CWchar | |
| Num CSize | |
| Num CPtrdiff | |
| Num CDouble | |
| Num CFloat | |
| Num CULLong | |
| Num CLLong | |
| Num CULong | |
| Num CLong | |
| Num CUInt | |
| Num CInt | |
| Num CUShort | |
| Num CShort | |
| Num CUChar | |
| Num CSChar | |
| Num CChar | |
| Num IntPtr | |
| Num WordPtr | |
| Num Fd | |
| Num CRLim | |
| Num CTcflag | |
| Num CSpeed | |
| Num CCc | |
| Num CUid | |
| Num CNlink | |
| Num CGid | |
| Num CSsize | |
| Num CPid | |
| Num COff | |
| Num CMode | |
| Num CIno | |
| Num CDev | |
| Num Natural | |
| Integral a => Num (Ratio a) | |
| Num a => Num (Product a) | |
| Num a => Num (Sum a) | |
| RealFloat a => Num (Complex a) | |
| HasResolution a => Num (Fixed a) | |
| Num (f a) => Num (Alt k f a) |
класс (Num a, Ord a) => Real a где Источник
Методы
toRational :: a -> Rational Источник
рациональное эквивалент действительного аргумента с полной точностью
Примеры реализации
class (Real a, Enum a) => Целочисленный a где Источник
Целые числа, поддерживающие целочисленное деление.
Методы
quot :: a -> a -> a infixl 7 Источник
Целочисленное деление, усеченное до нуля
rem :: a -> a -> a infixl 7 Источник
Целочисленный остаток, удовлетворяющий
(x `quot` y)*y + (x `rem` y) == x
div :: a -> a -> a infixl 7 Источник
Целочисленное деление, усеченное к отрицательной бесконечности
mod :: a -> a -> a infixl 7 Источник
Целочисленный модуль, удовлетворяющий
(x `div` y)*y + (x `mod` y) == x
quotRem :: a -> a -> (a, a) Источник
Одновременное вычисление quot и rem
divMod :: a -> a -> (a, a) Источник
Одновременное вычисление div и mod
toInteger :: a -> Integer Источник
Преобразование в Integer
Примеры
класс Num a => Дробный a где Источник
Дробные числа, поддерживающие действительное деление.
Минимальное полное определение
fromRational, (recip | (/))
Методы
(/) :: a -> a -> a infixl 7 Источник
Дробное деление
Обратная дробь
fromRational :: Рациональное -> a Источник
Преобразование из Rational (то есть Ratio Integer). Число с плавающей точкой обозначает применение fromRational к значению типа Rational, поэтому такие литералы имеют тип (Fractional a) => a.
Примеры
| Дробный CDouble | |
| Дробный CFloat | |
| Целочисленный a => Дробный (Соотношение a) | |
| Вещественный с плавающей точкой a => Дробный (Комплексное a) | |
| HasResolution a => Дробный (Fixed a) |
класс Дробный a => Плавающий a где Источник
Тригонометрические и гиперболические функции и связанные функции.
Методы
exp, log, sqrt :: a -> a Источник
(**), logBase :: a -> a -> a infixr 8 Источник
sin, cos, tan :: a -> a Источник
asin, acos, atan :: a -> a Источник
Примеры
class (Real a, Fractional a) => RealFrac a where Источник
Извлечение компонентов дробей.
Минимальное полное определение
Методы
properFraction :: Integral b => a -> (b, a) Источник
Функция properFraction принимает вещественное дробное число x и возвращает пару (n,f), такую что x = n+f, и:
-
n— целое число со знаком, совпадающим со знакомx; и -
f— дробь со знаком, совпадающим со знакомx, и с абсолютной величиной меньше1.
Определения функций ceiling, floor, truncate и round по умолчанию основаны на properFraction.
truncate :: Integral b => a -> b Источник
truncate x возвращает целое число, ближайшее к x между нулем и x
round :: Integral b => a -> b Источник
round x возвращает ближайшее целое число к x; четное целое число, если x равноудалено от двух целых чисел
ceiling :: Integral b => a -> b Источник
ceiling x возвращает наименьшее целое число, не меньшее x
floor :: Integral b => a -> b Источник
floor x возвращает наибольшее целое число, не большее x
Примеры
class (RealFrac a, Floating a) => RealFloat a where Источник
Эффективный, независимый от машины доступ к компонентам числа с плавающей запятой.
Минимальное полное определение
floatRadix, floatDigits, floatRange, decodeFloat, encodeFloat, isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE
Методы
floatRadix :: a -> Integer Source
постоянная функция, возвращающая основание представления (часто 2)
floatDigits :: a -> Int Source
постоянная функция, возвращающая количество цифр floatRadix в мантиссе
floatRange :: a -> (Int, Int) Source
постоянная функция, возвращающая наименьшее и наибольшее значения, которые может принимать показатель степени
decodeFloat :: a -> (Integer, Int) Source
Функция decodeFloat при применении к вещественному числу с плавающей запятой возвращает мантиссу, выраженную как Integer, и соответствующий масштабированный показатель степени (целое число Int). Если decodeFloat x дает (m,n), то x имеет значение, равное m*b^^n, где b — основание представления с плавающей запятой, и, кроме того, либо m и n оба равны нулю, либо b^(d-1) <= abs m < b^d, где d — значение floatDigits x. В частности, decodeFloat 0 = (0,0). Если тип содержит отрицательный ноль, то также decodeFloat (-0.0) = (0,0). Результат decodeFloat x неопределён, если любой из isNaN x или isInfinite x является True.
encodeFloat :: Integer -> Int -> a Source
encodeFloat выполняет обратную операцию decodeFloat в том смысле, что для конечных x за исключением -0.0, uncurry encodeFloat (decodeFloat x) = x. encodeFloat m n — это одно из двух ближайших представимых чисел с плавающей запятой к m*b^^n (или ±Infinity в случае переполнения); обычно более близкое, но если m содержит слишком много битов, результат может быть округлен в неправильном направлении.
exponent соответствует второму компоненту decodeFloat. exponent 0 = 0 и для конечных ненулевых x, exponent x = snd (decodeFloat x) + floatDigits x. Если x — конечное число с плавающей запятой, оно равно significand x * b ^^ exponent x, где b — основание представления с плавающей запятой. Поведение неопределено для бесконечных или NaN значений.
significand :: a -> a Source
Первый компонент decodeFloat, масштабированный так, чтобы лежать в открытом интервале (-1,1), либо 0.0 или с абсолютным значением >= 1/b, где b — основание представления с плавающей запятой. Поведение неопределено для бесконечных или NaN значений.
scaleFloat :: Int -> a -> a Source
умножает число с плавающей запятой на целую степень основания
True если аргумент — значение IEEE «не число» (NaN)
isInfinite :: a -> Bool Source
True если аргумент — бесконечность IEEE или отрицательная бесконечность
isDenormalized :: a -> Bool Source
True если аргумент слишком мал, чтобы быть представленным в нормализованном формате
isNegativeZero :: a -> Bool Source
True если аргумент — отрицательный ноль IEEE
True если аргумент — число с плавающей запятой IEEE
вариант арктангенса, принимающий два вещественных аргумента с плавающей запятой. Для вещественных чисел с плавающей запятой x и y, atan2 y x вычисляет угол (от положительной оси x) вектора от начала координат до точки (x,y). atan2 y x возвращает значение в диапазоне [-pi, pi]. Следует семантике Common Lisp для начала координат, когда поддерживаются знаковые нули. atan2 y 1, с y в типе, который RealFloat, должен возвращать то же значение, что и atan y. Представлено стандартное определение atan2, но реализаторы могут предоставить более точную реализацию.
Числовые функции
subtract :: Num a => a -> a -> a Source
Поскольку - обрабатывается специально в грамматике Haskell, (- e) — это не секция, а применение префиксного отрицания. Однако (subtract exp) эквивалентно запрещённой секции.
even :: Integral a => a -> Bool Source
odd :: Integral a => a -> Bool Source
gcd :: Integral a => a -> a -> a Source
gcd x y — это наибольший неотрицательный общий делитель x и y, то есть такой общий делитель x и y, который сам делится на любой их общий делитель; например, gcd 4 2 = 2, gcd (-4) 6 = 2, gcd 0 4 = 4. gcd 0 0 = 0. (То есть наибольший общий делитель в порядке делимости.)
Примечание: Поскольку для подписанных целых чисел с фиксированной шириной abs minBound < 0, результат может быть отрицательным, если один из аргументов — minBound (и обязательно, если другой — 0 или minBound) для таких типов.
lcm :: Integral a => a -> a -> a Source
lcm x y — наименьшее положительное целое число, которое делит как x, так и y.
(^) :: (Num a, Integral b) => a -> b -> a infixr 8 Source
возведение числа в неотрицательную целую степень
(^^) :: (Fractional a, Integral b) => a -> b -> a infixr 8 Source
возведение числа в целую степень
fromIntegral :: (Integral a, Num b) => a -> b Source
общее приведение из целочисленных типов
realToFrac :: (Real a, Fractional b) => a -> b Source
общее приведение к типам с плавающей точкой
Моноиды
Класс моноидов (типы с ассоциативной бинарной операцией, имеющей единицу). Экземпляры должны удовлетворять следующим законам:
mappend mempty x = x
mappend x mempty = x
mappend x (mappend y z) = mappend (mappend x y) z
mconcat =
foldrmappend mempty
Названия методов относятся к моноиду списков при конкатенации, но существует много других экземпляров.
Некоторые типы могут рассматриваться как моноид более чем одним способом, например, как сложение, так и умножение чисел. В таких случаях мы часто определяем newtypes и делаем эти экземпляры Monoid, например Sum и Product.
Методы
Единица mappend
Ассоциативная операция
Сворачивает список, используя моноид. Для большинства типов будет использовано стандартное определение для mconcat, но функция включена в определение класса, чтобы можно было предоставить оптимизированную версию для конкретных типов.
Экземпляры
| Monoid Ordering | |
| Monoid () | |
| Monoid Any | |
| Monoid All | |
| Monoid Lifetime |
|
| Monoid Event | |
| Monoid [a] | |
| Monoid a => Monoid (Maybe a) | Поднимает полугруппу в |
| Monoid (Last a) | |
| Monoid (First a) | |
| Num a => Monoid (Product a) | |
| Num a => Monoid (Sum a) | |
| Monoid (Endo a) | |
| Monoid a => Monoid (Dual a) | |
| Monoid b => Monoid (a -> b) | |
| (Monoid a, Monoid b) => Monoid (a, b) | |
| Monoid (Proxy k s) | |
| Monoid a => Monoid (Const a b) | |
| (Monoid a, Monoid b, Monoid c) => Monoid (a, b, c) | |
| Alternative f => Monoid (Alt * f a) | |
| (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) | |
| (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monoid (a, b, c, d, e) |
Моноиды и функторы
Класс Functor используется для типов, по которым можно выполнять отображение. Экземпляры Functor должны удовлетворять следующим законам:
fmap id == id fmap (f . g) == fmap f . fmap g
Экземпляры Functor для списков, Maybe и IO удовлетворяют этим законам.
Минимальное полное определение
Примеры использования
| Functor [] | |
| Functor IO | |
| Functor Может быть | |
| Functor ReadP | |
| Functor ReadPrec | |
| Functor Последний | |
| Functor Первый | |
| Functor STM | |
| Functor Обработчик | |
| Functor ZipList | |
| Functor Идентичность | |
| Functor Описание аргумента | |
| Functor Описание опции | |
| Functor Порядок аргументов | |
| Functor ((->) r) | |
| Functor (Either a) | |
| Functor ((,) a) | |
| Functor (ST s) | |
| Functor (Прокси *) | |
| Arrow a => Functor (ArrowMonad a) | |
| Monad m => Functor (WrappedMonad m) | |
| Functor (Const m) | |
| Functor (ST s) | |
| Functor f => Functor (Alt * f) | |
| Arrow a => Functor (WrappedArrow a b) |
(<$>) :: Functor f => (a -> b) -> f a -> f b infixl 4 Источник
Инфиксный синоним для fmap.
Примеры
Преобразование из Maybe Int в Maybe String с помощью show:
>>>show <$> NothingNothing>>>show <$> Just 3Just "3"
Преобразование из Either Int Int в Either Int String с помощью show:
>>>show <$> Left 17Left 17>>>show <$> Right 17Right "17"
Удвоение каждого элемента в списке:
>>>(*2) <$> [1,2,3][2,4,6]
Применение even ко второму элементу пары:
>>>even <$> (2,2)(2,True)
class Functor f => Applicative f where Источник
Функтор с применением, предоставляющий операции для
- встраивания чистых выражений (
pure), и - последовательного выполнения вычислений и объединения их результатов (
<*>).
Минимальное полное определение должно включать реализации этих функций, удовлетворяющие следующим законам:
- тождество
pureid<*>v = v- композиция
pure(.)<*>u<*>v<*>w = u<*>(v<*>w)- гомоморфизм
puref<*>purex =pure(f x)- перестановка
u
<*>purey =pure($y)<*>u
Другие методы имеют следующие определения по умолчанию, которые могут быть переопределены эквивалентными специализированными реализациями:
Вследствие этих законов, Functor экземпляр для f будет удовлетворять
Если f также является Monad, оно должно удовлетворять
(что подразумевает, что pure и <*> удовлетворяют законам функтора с применением).
Методы
Поднятие значения.
(<*>) :: f (a -> b) -> f a -> f b infixl 4 Источник
Последовательное применение.
(*>) :: f a -> f b -> f b infixl 4 Источник
Последовательное выполнение действий, отбрасывая значение первого аргумента.
(<*) :: f a -> f b -> f a infixl 4 Источник
Последовательное выполнение действий, отбрасывая значение второго аргумента.
Примеры
| Applicative [] | |
| Applicative IO | |
| Applicative Maybe | |
| Applicative ReadP | |
| Applicative ReadPrec | |
| Applicative Last | |
| Applicative First | |
| Applicative STM | |
| Applicative ZipList | |
| Applicative Identity | |
| Applicative ((->) a) | |
| Applicative (Either e) | |
| Monoid a => Applicative ((,) a) | |
| Applicative (ST s) | |
| Applicative (Proxy *) | |
| Arrow a => Applicative (ArrowMonad a) | |
| Monad m => Applicative (WrappedMonad m) | |
| Monoid m => Applicative (Const m) | |
| Applicative (ST s) | |
| Applicative f => Applicative (Alt * f) | |
| Arrow a => Applicative (WrappedArrow a b) |
класс Applicative m => Monad m где Источник
Класс Monad определяет основные операции над монадой, концепцией из области математики, известной как теория категорий. Однако с точки зрения программиста Haskell лучше рассматривать монаду как абстрактный тип данных действий. Выражения Haskell's do предоставляют удобный синтаксис для записи монадных выражений.
Примеры Monad должны удовлетворять следующим законам:
Кроме того, операции Monad и Applicative должны быть связаны следующим образом:
Вышеупомянутые законы подразумевают:
и что pure и (<*>) удовлетворяют законам функционального аппликативного типа.
Примеры Monad для списков, Maybe и IO определённые в Prelude удовлетворяют этим законам.
Минимальное полное определение
Методы
(>>=) :: forall a b. m a -> (a -> m b) -> m b infixl 1 Источник
Последовательно объединяет два действия, передавая любое значение, произведённое первым, в качестве аргумента второму.
(>>) :: forall a b. m a -> m b -> m b infixl 1 Источник
Последовательно объединяет два действия, отбрасывая любое значение, произведённое первым, подобно операторам последовательности (например, точка с запятой) в императивных языках.
Вводит значение в тип монады.
fail :: String -> m a Источник
Неудачный результат с сообщением. Эта операция не является частью математического определения монады, но вызывается при неудачном совпадении шаблонов в выражении do.
Примеры
mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () Источник
Применяет каждое элементу структуры монадное действие, оценивает эти действия слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. mapM.
Начиная с версии base 4.8.0.0, mapM_ это просто traverse_, специализированная для Monad.
sequence_ :: (Foldable t, Monad m) => t (m a) -> m () Источник
Вычисляет каждое монадное действие в структуре слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. sequence.
Начиная с версии base 4.8.0.0, sequence_ это просто sequenceA_, специализированная для Monad.
(=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 Источник
То же, что и >>=, но с переставленными аргументами.
Склады и обходы
Структуры данных, которые можно сложить.
Например, задан тип данных
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
подходящий экземпляр будет
instance Foldable Tree where foldMap f Empty = mempty foldMap f (Leaf x) = f x foldMap f (Node l k r) = foldMap f l `mappend` f k `mappend` foldMap f r
Это подходит даже для абстрактных типов, так как предполагается, что моноид удовлетворяет законам моноида. В качестве альтернативы, можно определить foldr:
instance Foldable Tree where foldr f z Empty = z foldr f z (Leaf x) = f x z foldr f z (Node l k r) = foldr f (f k (foldr f z r)) l
Foldable экземпляры должны удовлетворять следующим законам:
foldr f z t = appEndo (foldMap (Endo . f) t ) z
foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z
fold = foldMap id
sum, product, maximum, и minimum должны быть в сущности эквивалентны foldMap формам, таким как
sum = getSum . foldMap Sum
но могут быть менее определёнными.
Если тип также является экземпляром Functor , он должен удовлетворять
foldMap f = fold . fmap f
что подразумевает, что
foldMap f . fmap g = foldMap (f . g)
Методы
foldMap :: Monoid m => (a -> m) -> t a -> m Source
Применяет к каждому элементу структуры функцию, преобразующую его в элемент моноида, и объединяет результаты.
foldr :: (a -> b -> b) -> b -> t a -> b Source
Сворачивание структуры справа налево.
foldrf z =foldrf z .toList
foldl :: (b -> a -> b) -> b -> t a -> b Source
Сворачивание структуры слева направо.
foldlf z =foldlf z .toList
foldr1 :: (a -> a -> a) -> t a -> a Source
Вариант foldr, не имеющий базового случая, и поэтому может быть применён только к непустым структурам.
foldr1f =foldr1f .toList
foldl1 :: (a -> a -> a) -> t a -> a Source
Вариант foldl, не имеющий базового случая, и поэтому может быть применён только к непустым структурам.
foldl1f =foldl1f .toList
Проверка, пуста ли структура. По умолчанию реализация оптимизирована для структур, похожих на списки, потому что нет общего способа сделать лучше.
Возвращает размер/длину конечной структуры как Int. По умолчанию реализация оптимизирована для структур, похожих на списки, потому что нет общего способа сделать лучше.
elem :: Eq a => a -> t a -> Bool infix 4 Source
Находится ли элемент в структуре?
maximum :: forall a. Ord a => t a -> a Source
Наибольший элемент непустой структуры.
minimum :: forall a. Ord a => t a -> a Source
Наименьший элемент непустой структуры.
sum :: Num a => t a -> a Source
Функция sum вычисляет сумму чисел в структуре.
product :: Num a => t a -> a Source
Функция product вычисляет произведение чисел в структуре.
Экземпляры
class (Functor t, Foldable t) => Traversable t where Source
Функторы, представляющие структуры данных, которые можно пройти слева направо.
Определение traverse должно удовлетворять следующим законам:
- естественность
-
t . traverse f = traverse (t . f)для каждой аппликативной трансформацииt - тождество
traverse Identity = Identity- составление
traverse (Compose . fmap g . f) = Compose . fmap (traverse g) . traverse f
Определение sequenceA должно удовлетворять следующим законам:
- естественность
-
t . sequenceA = sequenceA . fmap tдля каждой аппликативной трансформацииt - тождество
sequenceA . fmap Identity = Identity- составление
sequenceA . fmap Compose = Compose . fmap sequenceA . sequenceA
где аппликативная трансформация — это функция
t :: (Applicative f, Applicative g) => f a -> g a
сохраняющая операции Applicative, т.е.
и тождественный функтор Identity и композиция функторов Compose определяются как
newtype Identity a = Identity a
instance Functor Identity where
fmap f (Identity x) = Identity (f x)
instance Applicative Indentity where
pure x = Identity x
Identity f <*> Identity x = Identity (f x)
newtype Compose f g a = Compose (f (g a))
instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose (fmap (fmap f) x)
instance (Applicative f, Applicative g) => Applicative (Compose f g) where
pure x = Compose (pure (pure x))
Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)
(Закон естественности подразумевается параметричностью.)
Экземпляры аналогичны Functor, например, задан тип данных
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
подходящий экземпляр будет
instance Traversable Tree where traverse f Empty = pure Empty traverse f (Leaf x) = Leaf <$> f x traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r
Это подходит даже для абстрактных типов, так как законы для <*> подразумевают форму ассоциативности.
Экземпляры суперклассов должны удовлетворять следующим условиям:
- В экземпляре
Functor,fmapдолжен быть эквивалентен обходу с тождественным аппликативным функтором (fmapDefault). - В экземпляре
Foldable,foldMapдолжен быть эквивалентен обходу с постоянным аппликативным функтором (foldMapDefault).
Методы
traverse :: Applicative f => (a -> f b) -> t a -> f (t b) Source
Применяет к каждому элементу структуры действие, вычисляет эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. traverse_.
sequenceA :: Applicative f => t (f a) -> f (t a) Source
Вычисляет каждое действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequenceA_.
mapM :: Monad m => (a -> m b) -> t a -> m (t b) Source
Применяет к каждому элементу структуры моноидальное действие, вычисляет эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. mapM_.
sequence :: Monad m => t (m a) -> m (t a) Source
Вычисляет каждое моноидальное действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequence_.
Примеры реализации
| Traversable [] | |
| Traversable Maybe | |
| Traversable Identity | |
| Traversable (Either a) | |
| Traversable ((,) a) | |
| Traversable (Proxy *) | |
| Traversable (Const m) |
Разные функции
Функция тождества.
Функция константы.
(.) :: (b -> c) -> (a -> b) -> a -> c infixr 9 Источник
Композиция функций.
flip :: (a -> b -> c) -> b -> a -> c Источник
Меняет порядок первых двух аргументов функции.
($) :: (a -> b) -> a -> b infixr 0 Источник
Оператор применения. Этот оператор избыточен, так как обычное применение функции эквивалентно применению с этим оператором. Однако, этот оператор имеет низкий, правоассоциативный приоритет, поэтому иногда позволяет опустить скобки; например:
f $ g $ h x = f (g (h x))
Он также полезен в ситуациях с высшим порядком функций, таких как map ($ 0) xs, или zipWith ($) fs xs.
until :: (a -> Bool) -> (a -> a) -> a -> a Источник
until p f возвращает результат применения f до тех пор, пока p не станет истинным.
asTypeOf :: a -> a -> a Источник
asTypeOf — это версия const с ограничениями на тип. Обычно используется как инфиксный оператор, а его типизация принуждает первый аргумент (который обычно перегружен) иметь тот же тип, что и второй.
error останавливает выполнение и отображает сообщение об ошибке.
Особый случай error. Ожидается, что компиляторы распознают это и вставят сообщения об ошибках, более подходящие к контексту, в котором undefined появляется.
Значение seq a b — неопределённо, если a — неопределённо, а в противном случае равно b . Обычно seq используется для повышения производительности, избегая ненужной лени.
Замечание по порядку вычислений: выражение seq a b не гарантирует, что a будет вычислено до b. Единственная гарантия, предоставляемая seq, заключается в том, что a и b будут вычислены до того, как seq вернёт значение. В частности, это означает, что b может быть вычислено до a . Если вам нужно гарантировать определённый порядок вычислений, используйте функцию pseq из пакета "parallel".
($!) :: (a -> b) -> a -> b infixr 0 Источник
Строгий (вызов по значению) оператор применения. Принимает функцию и аргумент, вычисляет аргумент до слабой нормальной формы (WHNF), затем вызывает функцию с этим значением.
Операции со списками
map :: (a -> b) -> [a] -> [b] Источник
map f xs — это список, полученный путём применения f к каждому элементу xs, т.е.,
map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn] map f [x1, x2, ...] == [f x1, f x2, ...]
(++) :: [a] -> [a] -> [a] infixr 5 Источник
Присоединение двух списков, т.е.,
[x1, ..., xm] ++ [y1, ..., yn] == [x1, ..., xm, y1, ..., yn] [x1, ..., xm] ++ [y1, ...] == [x1, ..., xm, y1, ...]
Если первый список бесконечен, результатом будет первый список.
filter :: (a -> Bool) -> [a] -> [a] Источник
filter, применённая к предикату и списку, возвращает список элементов, удовлетворяющих предикату; т.е.,
filter p xs = [ x | x <- xs, p x]
Извлечение первого элемента списка, который должен быть непустым.
Извлечение последнего элемента списка, который должен быть конечным и непустым.
Извлечение элементов после первого элемента списка, который должен быть непустым.
Возвращение всех элементов списка, кроме последнего. Список должен быть непустым.
(!!) :: [a] -> Int -> a infixl 9 Источник
Оператор индексации списка (индекс), начиная с 0. Он является примером более общей функции genericIndex, которая принимает индекс любого целочисленного типа.
reverse :: [a] -> [a] Источник
reverse xs возвращает элементы xs в обратном порядке. xs должен быть конечным.
Специальные свертки
and :: Foldable t => t Bool -> Bool Источник
and возвращает конъюнкцию контейнера булевых значений. Для получения истинного результата, контейнер должен быть конечным; False, однако, результат от False значения, находящегося на конечном расстоянии слева.
or :: Foldable t => t Bool -> Bool Источник
or возвращает дизъюнкцию контейнера булевых значений. Для получения истинного результата, контейнер должен быть конечным; True, однако, результат от True значения, находящегося на конечном расстоянии слева.
any :: Foldable t => (a -> Bool) -> t a -> Bool Источник
Определяет, удовлетворяет ли какой-либо элемент структуры предикату.
all :: Foldable t => (a -> Bool) -> t a -> Bool Источник
Определяет, удовлетворяют ли все элементы структуры предикату.
concat :: Foldable t => t [a] -> [a] Source
Конкатенация всех элементов контейнера списков.
concatMap :: Foldable t => (a -> [b]) -> t a -> [b] Source
Применение функции к каждому элементу контейнера и конкатенация полученных списков.
Создание списков
Сканирование
scanl :: (b -> a -> b) -> b -> [a] -> [b] Source
scanl аналогично foldl, но возвращает список последовательных результирующих значений слева направо:
scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
Обратите внимание, что
last (scanl f z xs) == foldl f z xs.
scanl1 :: (a -> a -> a) -> [a] -> [a] Source
scanl1 является вариантом scanl, у которого нет аргумента начального значения:
scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]
scanr :: (a -> b -> b) -> b -> [a] -> [b] Source
scanr — это правая версия scanl. Обратите внимание, что
head (scanr f z xs) == foldr f z xs.
scanr1 :: (a -> a -> a) -> [a] -> [a] Source
scanr1 является вариантом scanr, у которого нет аргумента начального значения.
Бесконечные списки
iterate :: (a -> a) -> a -> [a] Source
iterate f x возвращает бесконечный список повторных применений f к x:
iterate f x == [x, f x, f (f x), ...]
repeat x — это бесконечный список, где значение каждого элемента — x.
replicate :: Int -> a -> [a] Source
replicate n x — это список длиной n со значением x каждого элемента. Он является примером более общей genericReplicate, в которой n может быть любого целочисленного типа.
cycle преобразует конечный список в циклический, или эквивалентно, в бесконечное повторение исходного списка. Это тождественная функция для бесконечных списков.
Подсписки
take :: Int -> [a] -> [a] Source
take n, применённое к списку xs, возвращает префикс xs длины n, или сам список xs , если n > length xs:
take 5 "Hello World!" == "Hello" take 3 [1,2,3,4,5] == [1,2,3] take 3 [1,2] == [1,2] take 3 [] == [] take (-1) [1,2] == [] take 0 [1,2] == []
Это пример более общей функции genericTake, в которой n может быть любого целочисленного типа.
drop :: Int -> [a] -> [a] Source
drop n xs возвращает суффикс xs после первых n элементов, или сам список [] если n > length xs:
drop 6 "Hello World!" == "World!" drop 3 [1,2,3,4,5] == [4,5] drop 3 [1,2] == [] drop 3 [] == [] drop (-1) [1,2] == [1,2] drop 0 [1,2] == [1,2]
Это пример более общей функции genericDrop, в которой n может быть любого целочисленного типа.
splitAt :: Int -> [a] -> ([a], [a]) Source
splitAt n xs возвращает кортеж, где первым элементом является префикс xs длины n, а вторым — остаток списка:
splitAt 6 "Hello World!" == ("Hello ","World!")
splitAt 3 [1,2,3,4,5] == ([1,2,3],[4,5])
splitAt 1 [1,2,3] == ([1],[2,3])
splitAt 3 [1,2,3] == ([1,2,3],[])
splitAt 4 [1,2,3] == ([1,2,3],[])
splitAt 0 [1,2,3] == ([],[1,2,3])
splitAt (-1) [1,2,3] == ([],[1,2,3])
Это эквивалентно (take n xs, drop n xs) , когда n не _|_ (splitAt _|_ xs = _|_). splitAt является примером более общей функции genericSplitAt, в которой n может быть любого целочисленного типа.
takeWhile :: (a -> Bool) -> [a] -> [a] Source
takeWhile, применённое к предикату p и списку xs, возвращает самый длинный префикс (возможно пустой) xs элементов, удовлетворяющих p:
takeWhile (< 3) [1,2,3,4,1,2,3,4] == [1,2] takeWhile (< 9) [1,2,3] == [1,2,3] takeWhile (< 0) [1,2,3] == []
dropWhile :: (a -> Bool) -> [a] -> [a] Source
dropWhile p xs возвращает суффикс, оставшийся после takeWhile p xs:
dropWhile (< 3) [1,2,3,4,5,1,2,3] == [3,4,5,1,2,3] dropWhile (< 9) [1,2,3] == [] dropWhile (< 0) [1,2,3] == [1,2,3]
span :: (a -> Bool) -> [a] -> ([a], [a]) Source
span, применённое к предикату p и списку xs, возвращает кортеж, где первым элементом является самый длинный префикс (возможно пустой) xs элементов, удовлетворяющих p, а вторым — остаток списка:
span (< 3) [1,2,3,4,1,2,3,4] == ([1,2],[3,4,1,2,3,4]) span (< 9) [1,2,3] == ([1,2,3],[]) span (< 0) [1,2,3] == ([],[1,2,3])
span p xs эквивалентно (takeWhile p xs, dropWhile p xs)
break :: (a -> Bool) -> [a] -> ([a], [a]) Source
break, применённое к предикату p и списку xs, возвращает кортеж, где первым элементом является самый длинный префикс (возможно пустой) xs элементов, не удовлетворяющих p, а вторым — остаток списка:
break (> 3) [1,2,3,4,1,2,3,4] == ([1,2,3],[4,1,2,3,4]) break (< 9) [1,2,3] == ([],[1,2,3]) break (> 9) [1,2,3] == ([1,2,3],[])
break p эквивалентно span (not . p).
Поиск в списках
notElem :: (Foldable t, Eq a) => a -> t a -> Bool infix 4 Source
lookup :: Eq a => a -> [(a, b)] -> Maybe b Source
lookup key assocs выполняет поиск ключа в списке ассоциаций.
Объединение и разделение списков
zip :: [a] -> [b] -> [(a, b)] Source
zip принимает два списка и возвращает список соответствующих пар. Если один из входных списков короче, избыточные элементы более длинного списка отбрасываются.
zip — правая ленивая функция:
zip [] _|_ = []
zip3 :: [a] -> [b] -> [c] -> [(a, b, c)] Source
zip3 принимает три списка и возвращает список троек, аналогично zip.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Source
zipWith обобщает zip путём объединения с функцией, указанной в качестве первого аргумента, вместо функции построения кортежей. Например, zipWith (+) применяется к двум спискам для получения списка соответствующих сумм.
zipWith — правая ленивая функция:
zipWith f [] _|_ = []
zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] Source
Функция zipWith3 принимает функцию, которая объединяет три элемента, а также три списка, и возвращает список их точечного объединения, аналогично zipWith.
unzip :: [(a, b)] -> ([a], [b]) Source
unzip преобразует список пар в список первых компонентов и список вторых компонентов.
unzip3 :: [(a, b, c)] -> ([a], [b], [c]) Source
Функция unzip3 принимает список троек и возвращает три списка, аналогично unzip.
Функции для строк
lines :: String -> [String] Source
lines разбивает строку на список строк по символам новой строки. Результирующие строки не содержат символы новой строки.
words :: String -> [String] Source
words разбивает строку на список слов, разделяемых пробелами.
unlines :: [String] -> String Source
unlines — обратная операция к lines. Она объединяет строки, добавляя символ новой строки в конец каждой.
unwords :: [String] -> String Source
unwords — обратная операция к words. Она объединяет слова, разделяя их пробелами.
Преобразование в строку и из строки
Преобразование в String
type ShowS = String -> String Source
Функции shows возвращают функцию, которая добавляет результат String к существующей String. Это позволяет выполнять конкатенацию результатов с использованием композиции функций за постоянное время.
Преобразование значений в удобочитаемые String.
Производные экземпляры Show имеют следующие свойства, совместимые с производными экземплярами Read.
- Результат
show— это синтаксически корректное выражение Haskell, содержащее только константы, учитывая директивы фиксы, действующие в момент объявления типа. Оно содержит только имена конструкторов, определённые в типе данных, скобки и пробелы. При использовании помеченных полей конструктора также используются фигурные скобки, запятые, имена полей и знаки равенства. - Если конструктор определён как инфиксный оператор, то
showsPrecсоздаст инфиксное применение конструктора. - Представление будет заключено в скобки, если приоритет конструктора верхнего уровня в
xменьшеd(ассоциативность игнорируется). Таким образом, еслиd—0, то результат никогда не будет заключён в скобки; еслиd—11, он всегда будет заключён в скобки, если не является атомарным выражением. - Если конструктор определён с помощью синтаксиса записей, то
showсоздаст форму синтаксиса записей, с полями в том же порядке, что и в исходном объявлении.
Например, при объявлениях
infixr 5 :^: data Tree a = Leaf a | Tree a :^: Tree a
производный экземпляр Show эквивалентен
instance (Show a) => Show (Tree a) where
showsPrec d (Leaf m) = showParen (d > app_prec) $
showString "Leaf " . showsPrec (app_prec+1) m
where app_prec = 10
showsPrec d (u :^: v) = showParen (d > up_prec) $
showsPrec (up_prec+1) u .
showString " :^: " .
showsPrec (up_prec+1) v
where up_prec = 5
Обратите внимание, что правоассоциативность :^: игнорируется. Например,
-
show (Leaf 1 :^: Leaf 2 :^: Leaf 3)создаёт строку"Leaf 1 :^: (Leaf 2 :^: Leaf 3)".
Методы
Аргументы
| :: Int | приоритет оператора окружающего контекста (число от |
| -> a | значение, которое нужно преобразовать в |
| -> ShowS |
Преобразование значения в удобочитаемое String.
showsPrec должно удовлетворять закону
showsPrec d x r ++ s == showsPrec d x (r ++ s)
Производные экземпляры Read и Show удовлетворяют следующим:
То есть, readsPrec парсит строку, произведённую showsPrec, и возвращает значение, с которым showsPrec начинало.
Специализированная версия showsPrec, использующая контекст приоритета ноль и возвращающая обычную String.
showList :: [a] -> ShowS Source
Метод showList предоставляет возможность программисту указать специализированный способ отображения списков значений. Например, он используется предопределённым экземпляром Show типа Char, где значения типа String должны отображаться в двойных кавычках, а не в квадратных скобках.
Экземпляры
| Show p => Show (Par1 p) | |
| Show a => Show (Maybe a) | |
| Show a => Show (Down a) | |
| Show a => Show (Last a) | |
| Show a => Show (First a) | |
| Show a => Show (Product a) | |
| Show a => Show (Sum a) | |
| Show a => Show (Dual a) | |
| Show (ForeignPtr a) | |
| Show a => Show (ZipList a) | |
| Show a => Show (Complex a) | |
| HasResolution a => Show (Fixed a) | |
| Show a => Show (Identity a) | Этот экземпляр был бы эквивалентен производным экземплярам нового типа |
| (Show a, Show b) => Show (Either a b) | |
| Show (f p) => Show (Rec1 f p) | |
| (Show a, Show b) => Show (a, b) | |
| Show (ST s a) | |
| Show (Proxy k s) | |
| Show a => Show (Const a b) | |
| Show c => Show (K1 i c p) | |
| (Show (f p), Show (g p)) => Show ((:+:) f g p) | |
| (Show (f p), Show (g p)) => Show ((:*:) f g p) | |
| Show (f (g p)) => Show ((:.:) f g p) | |
| (Show a, Show b, Show c) => Show (a, b, c) | |
| Show ((:~:) k a b) | |
| Show (Coercion k a b) | |
| Show (f a) => Show (Alt k f a) | |
| Show (f p) => Show (M1 i c f p) | |
| (Show a, Show b, Show c, Show d) => Show (a, b, c, d) | |
| (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) | |
| (Show a, Show b, Show c, Show d, Show e, Show f) => Show (a, b, c, d, e, f) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g) => Show (a, b, c, d, e, f, g) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) => Show (a, b, c, d, e, f, g, h) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i) => Show (a, b, c, d, e, f, g, h, i) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j) => Show (a, b, c, d, e, f, g, h, i, j) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k) => Show (a, b, c, d, e, f, g, h, i, j, k) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l) => Show (a, b, c, d, e, f, g, h, i, j, k, l) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m) => Show (a, b, c, d, e, f, g, h, i, j, k, l, m) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m, Show n) => Show (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | |
| (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k, Show l, Show m, Show n, Show o) => Show (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) |
shows :: Show a => a -> ShowS Source
эквивалентно showsPrec с приоритетом 0.
showChar :: Char -> ShowS Source
функция-утилита, преобразующая Char в функцию показа, которая просто добавляет символ без изменений.
showString :: String -> ShowS Source
функция-утилита, преобразующая String в функцию показа, которая просто добавляет строку без изменений.
showParen :: Bool -> ShowS -> ShowS Source
функция-утилита, которая окружает внутреннюю функцию показа скобками, когда параметр Bool имеет значение True.
Преобразование из String
type ReadS a = String -> [(a, String)] Source
Парсер для типа a, представленный как функция, которая принимает String и возвращает список возможных парсеров в виде пар (a,String).
Обратите внимание, что этот вид парсера с обратной отработкой очень неэффективен; чтение большой структуры может быть довольно медленным (см. ReadP).
Парсинг String, генерирующий значения.
Производные экземпляры Read делают следующие предположения, которым подчиняются производные экземпляры Show:
- Если конструктор определен как инфиксный оператор, то производный экземпляр
Readбудет парсить только инфиксные применения конструктора (а не префиксную форму). - Ассоциативность не используется для сокращения количества скобок, хотя приоритет может быть учтён.
- Если конструктор определен с использованием синтаксиса записей, производный экземпляр
Readбудет парсить только форму с синтаксисом записей, и, кроме того, поля должны быть заданы в том же порядке, что и в исходном объявлении. - Производный экземпляр
Readдопускает произвольные пробелы Haskell между токенами входной строки. Также допускаются дополнительные скобки.
Например, при следующих объявлениях
infixr 5 :^: data Tree a = Leaf a | Tree a :^: Tree a
производный экземпляр Read в Haskell 2010 эквивалентен
instance (Read a) => Read (Tree a) where
readsPrec d r = readParen (d > app_prec)
(\r -> [(Leaf m,t) |
("Leaf",s) <- lex r,
(m,t) <- readsPrec (app_prec+1) s]) r
++ readParen (d > up_prec)
(\r -> [(u:^:v,w) |
(u,s) <- readsPrec (up_prec+1) r,
(":^:",t) <- lex s,
(v,w) <- readsPrec (up_prec+1) t]) r
where app_prec = 10
up_prec = 5
Обратите внимание, что правая ассоциативность :^: не используется.
Производный экземпляр в GHC эквивалентен
instance (Read a) => Read (Tree a) where
readPrec = parens $ (prec app_prec $ do
Ident "Leaf" <- lexP
m <- step readPrec
return (Leaf m))
+++ (prec up_prec $ do
u <- step readPrec
Symbol ":^:" <- lexP
v <- step readPrec
return (u :^: v))
where app_prec = 10
up_prec = 5
readListPrec = readListPrecDefault
Методы
Аргументы
| :: Int | приоритет оператора окружающего контекста (число от |
| -> ReadS a |
пытается разобрать значение из начала строки, возвращая список пар (разборённое значение, оставшаяся строка). Если разбор невозможен, возвращаемый список пуст.
Производные экземпляры Read и Show удовлетворяют следующим:
То есть, readsPrec разбирает строку, сгенерированную showsPrec, и предоставляет значение, с которым showsPrec начал.
Метод readList предоставляется для возможности программисту предоставить специализированный способ разбора списков значений. Например, это используется экземпляром Read предопределённого типа Char, где значения типа String должны использовать двойные кавычки, а не квадратные скобки.
Экземпляры
| (Integral a, Read a) => Read (Ratio a) | |
| Read (U1 p) | |
| Read p => Read (Par1 p) | |
| Read a => Read (Maybe a) | |
| Read a => Read (Down a) | |
| Read a => Read (Last a) | |
| Read a => Read (First a) | |
| Read a => Read (Product a) | |
| Read a => Read (Sum a) | |
| Read a => Read (Dual a) | |
| Read a => Read (ZipList a) | |
| Read a => Read (Complex a) | |
| HasResolution a => Read (Fixed a) | |
| Read a => Read (Identity a) | Этот экземпляр был бы эквивалентен производным экземплярам |
| (Read a, Read b) => Read (Either a b) | |
| Read (f p) => Read (Rec1 f p) | |
| (Read a, Read b) => Read (a, b) | |
| Read (Proxy k s) | |
| Read a => Read (Const a b) | |
| Read c => Read (K1 i c p) | |
| (Read (f p), Read (g p)) => Read ((:+:) f g p) | |
| (Read (f p), Read (g p)) => Read ((:*:) f g p) | |
| Read (f (g p)) => Read ((:.:) f g p) | |
| (Read a, Read b, Read c) => Read (a, b, c) | |
| (~) k a b => Read ((:~:) k a b) | |
| Coercible k a b => Read (Coercion k a b) | |
| Read (f a) => Read (Alt k f a) | |
| Read (f p) => Read (M1 i c f p) | |
| (Read a, Read b, Read c, Read d) => Read (a, b, c, d) | |
| (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) | |
| (Read a, Read b, Read c, Read d, Read e, Read f) => Read (a, b, c, d, e, f) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g) => Read (a, b, c, d, e, f, g) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) => Read (a, b, c, d, e, f, g, h) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i) => Read (a, b, c, d, e, f, g, h, i) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j) => Read (a, b, c, d, e, f, g, h, i, j) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k) => Read (a, b, c, d, e, f, g, h, i, j, k) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l) => Read (a, b, c, d, e, f, g, h, i, j, k, l) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n, Read o) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) |
reads :: Read a => ReadS a Source
эквивалентно readsPrec с приоритетом 0.
readParen :: Bool -> ReadS a -> ReadS a Source
readParen True p парсит то, что парсит p, но в окружении скобок.
readParen False p парсит то, что парсит p, но необязательно в окружении скобок.
read :: Read a => String -> a Source
Функция read считывает входные данные из строки, которая должна быть полностью использована процессом ввода.
Функция lex считывает одно лексему из входных данных, игнорируя начальные пробелы и возвращая символы, составляющие лексему. Если строка ввода содержит только пробелы, lex возвращает одну успешную `лексему`, состоящую из пустой строки. (Таким образом lex "" = [("","")].) Если в начале строки ввода нет законной лексемы, lex терпит неудачу (т. е. возвращает []).
Этот лексический анализатор не полностью соответствует синтаксису Haskell по следующим аспектам:
- Квалифицированные имена не обрабатываются должным образом
- Восьмеричные и шестнадцатеричные числа не распознаются как один токен
- Комментарии не обрабатываются должным образом
Основные операции ввода и вывода
Значение типа IO a представляет собой вычисление, которое при выполнении выполняет некоторые операции ввода-вывода перед возвращением значения типа a.
Существует только один способ "выполнить" действие ввода-вывода: привязать его к Main.main в вашей программе. При выполнении программы операции ввода-вывода будут выполнены. Выполнить операции ввода-вывода из произвольной функции невозможно, если функция сама не находится в монаде IO и не вызывается в какой-то момент, напрямую или косвенно, из Main.main.
IO является монадой, поэтому действия IO могут быть объединены с использованием либо синтаксиса do, либо операций >> и >>= из класса Monad.
Примеры
| Monad IO | |
| Functor IO | |
| MonadFix IO | |
| Applicative IO | |
| (~) * a () => HPrintfType (IO a) | |
| (~) * a () => PrintfType (IO a) |
Простые операции ввода-вывода
Функции вывода
putChar :: Char -> IO () Source
Выводит символ в стандартный вывод (то же, что hPutChar stdout).
putStr :: String -> IO () Source
Выводит строку в стандартный вывод (то же, что hPutStr stdout).
putStrLn :: String -> IO () Source
То же, что и putStr, но добавляет символ новой строки.
print :: Show a => a -> IO () Source
Функция print выводит значение любого печатаемого типа в стандартный вывод. Печатаемые типы — это те, которые являются экземплярами класса Show; print преобразует значения в строки для вывода, используя операцию show, и добавляет символ новой строки.
Например, программа для вывода первых 20 целых чисел и их степеней 2 может быть записана как:
main = print ([(n, 2^n) | n <- [0..19]])
Функции ввода
Считывает символ из стандартного устройства ввода (то же, что hGetChar stdin).
Считывает строку из стандартного устройства ввода (то же, что hGetLine stdin).
getContents :: IO String Source
Операция getContents возвращает все входные данные пользователя в виде одной строки, которая считывается лениво по мере необходимости (то же, что hGetContents stdin).
interact :: (String -> String) -> IO () Source
Функция interact принимает функцию типа String->String в качестве аргумента. Весь ввод со стандартного устройства ввода передается в эту функцию в качестве аргумента, а результирующая строка выводится на стандартное устройство вывода.
Файлы
Имена файлов и каталогов являются значениями типа String, точное значение которого зависит от операционной системы. Файлы могут быть открыты, что приводит к получению дескриптора, который затем можно использовать для работы с содержимым файла.
readFile :: FilePath -> IO String Source
Функция readFile считывает файл и возвращает содержимое файла в виде строки. Файл считывается лениво по мере необходимости, как и с getContents.
writeFile :: FilePath -> String -> IO () Source
Вычисление writeFile file str записывает строку str, в файл file.
appendFile :: FilePath -> String -> IO () Source
Вычисление appendFile file str добавляет строку str, к файлу file.
Обратите внимание, что writeFile и appendFile записывают в файл строку-литерал. Чтобы записать значение любого печатаемого типа, как в print, сначала используйте функцию show для преобразования значения в строку.
main = appendFile "squares" (show [(x,x*x) | x <- [0,0.1..2]])
readIO :: Read a => String -> IO a Source
Функция readIO похожа на read за исключением того, что она сигнализирует об ошибке разбора монаде IO вместо завершения программы.
readLn :: Read a => IO a Source
Функция readLn объединяет getLine и readIO.
Обработка исключений в монаде ввода-вывода
type IOError = IOException Source
Тип исключений Haskell 2010 в IO монаде. Любая операция ввода-вывода может вызвать IOError вместо возвращения результата. Для более общего типа исключения, включая те, которые возникают в чистом коде, см. Control.Exception.Exception.
В Haskell 2010 это непрозрачный тип.
ioError :: IOError -> IO a Source
userError :: String -> IOError Source
Создать значение IOError со строковым описанием ошибки. Метод fail экземпляра IO класса Monad вызывает userError, таким образом:
instance Monad IO where ... fail s = ioError (userError s)
© 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/Prelude.html