Spec-Zone.ru › Haskell 7

Предисловие

Авторские права (с) Университет Глазго 2001
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддержка libraries@haskell.org
Устойчивость стабильная
Переносимость переносимая
Безопасный Haskell Надёжный
Язык Haskell2010

Содержание

  • Стандартные типы, классы и связанные функции
    • Основные типы данных
      • Кортежи
    • Основные классы типов
    • Числа
      • Числовые типы
      • Числовые классы типов
      • Числовые функции
    • Моноиды
    • Монады и функторы
    • Склады и обходы
    • Разные функции
  • Операции со списками
    • Специальные склады
    • Создание списков
      • Сдвиги
      • Бесконечные списки
    • Подсписки
    • Поиск в списках
    • Сборка и разборка списков
    • Функции для строк
  • Преобразование в и из String
    • Преобразование в String
    • Преобразование из String
  • Базовый ввод и вывод
    • Простые операции ввода/вывода
      • Функции вывода
      • Функции ввода
      • Файлы
    • Обработка исключений в монаде I/O

Описание

Предисловие: стандартный модуль. Предисловие импортируется по умолчанию во все модули Haskell, если нет явного указания на импорт или включён расширение NoImplicitPrelude.

Стандартные типы, классы и связанные функции

Основные типы данных

data Bool :: * Исходный код

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

False
True

Экземпляры

Ограниченный Bool
Перечисление Bool
Равенство Bool
Данные Bool
Порядок Bool
Чтение Bool
Вывод Bool
Индекс Bool
Общий Bool
Конечные биты Bool
Биты Bool
Хранимый Bool
type Представление Bool
type (==) Bool a b

(&&) :: 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.

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

Nothing
Just a

Экземпляры

Монада 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)

Поднятие полугруппы в Maybe, образуя Monoid согласно http://en.wikipedia.org/wiki/Monoid: "Любая полугруппа S может быть превращена в моноид путём добавления элемента e, не входящего в S, и определения e*e = e и e*s = s = s*e для всех s ∈ S." Поскольку нет класса типов "Полугруппа", предоставляющего только mappend, мы используем Monoid вместо этого.

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 Nothing
False

Чтение целого числа из строки с использованием 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
""

data Either a b Source

Тип 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
>>> s
Left "foo"
>>> let n = Right 3 :: Either String Int
>>> n
Right 3
>>> :type s
s :: Either String Int
>>> :type n
n :: Either String Int

Функция fmap из нашего экземпляра Functor проигнорирует значения Left, но применит предоставленную функцию к значениям, содержащимся в Right:

>>> let s = Left "foo" :: Either String Int
>>> let n = Right 3 :: Either String Int
>>> fmap (*2) s
Left "foo"
>>> fmap (*2) n
Right 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)
>>> :}
>>> parseMultiple
Right 3

Но следующее должно завершиться неудачей, так как первое действие, где мы пытаемся разобрать 'm' как Int, завершится неудачей:

>>> :{
    let parseMultiple :: Either String Int
        parseMultiple = do
          x <- parseEither 'm'
          y <- parseEither '2'
          return (x + y)
>>> :}
>>> parseMultiple
Left "parse error"

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

Left a
Right b

Экземпляры

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) s
3
>>> either length (*2) n
6

data Ordering :: * Source

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

LT
EQ
GT

Экземпляры

Bounded Ordering
Enum Ordering
Eq Ordering
Data Ordering
Ord Ordering
Read Ordering
Show Ordering
Ix Ordering
Generic Ordering
Monoid Ordering
type Rep Ordering
type (==) Ordering a b

data Char :: * Source

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

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

Ограниченный Символ
Перечисление Символ
Eq Символ
Данные Символ
Ord Символ
Чтение Символ
Отображение Символ
Индекс Символ
Обобщенный Символ
Хранимый Символ
Символ Символ
АргументPrintf Символ
Строка [Символ]
type Представление Символ

type Строка = [Символ] Источник

A String представляет собой список символов. Константы строк в Haskell — это значения типа String.

Кортежи

fst :: (a, b) -> a Источник

Извлечение первого компонента пары.

snd :: (a, b) -> b Источник

Извлечение второго компонента пары.

curry :: ((a, b) -> c) -> a -> b -> c Источник

curry преобразует некаррированную функцию в каррированную.

uncurry :: (a -> b -> c) -> (a, b) -> c Источник

uncurry преобразует каррированную функцию в функцию над парами.

Базовые типы классов

class Eq a where Источник

Класс Eq определяет равенство (==) и неравенство (/=). Все основные типы данных, экспортируемые Prelude, являются экземплярами Eq, а Eq можно вывести для любого типа данных, чьи составляющие также являются экземплярами Eq.

Минимальное полное определение: либо == или /=.

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

(==) | (/=)

Методы

(==) :: a -> a -> Bool infix 4 Источник

(/=) :: a -> a -> Bool infix 4 Источник

Экземпляры

Eq Bool
Eq Char
Eq Double
Eq Float
Eq Int
Eq Int8
Eq Int16
Eq Int32
Eq Int64
Eq Integer
Eq Ordering
Eq Word
Eq Word8
Eq Word16
Eq Word32
Eq Word64
Eq CallStack
Eq TypeRep
Eq ()
Eq BigNat
Eq Number
Eq Lexeme
Eq GeneralCategory
Eq Fingerprint
Eq TyCon
Eq Associativity
Eq Fixity
Eq Arity
Eq Any
Eq All
Eq ArithException
Eq ErrorCall
Eq IOException
Eq MaskingState
Eq CUIntMax
Eq CIntMax
Eq CUIntPtr
Eq CIntPtr
Eq CSUSeconds
Eq CUSeconds
Eq CTime
Eq CClock
Eq CSigAtomic
Eq CWchar
Eq CSize
Eq CPtrdiff
Eq CDouble
Eq CFloat
Eq CULLong
Eq CLLong
Eq CULong
Eq CLong
Eq CUInt
Eq CInt
Eq CUShort
Eq CShort
Eq CUChar
Eq CSChar
Eq CChar
Eq IntPtr
Eq WordPtr
Eq BufferState
Eq CodingProgress
Eq SeekMode
Eq IODeviceType
Eq NewlineMode
Eq Newline
Eq BufferMode
Eq Handle
Eq IOErrorType
Eq ExitCode
Eq ArrayException
Eq AsyncException
Eq Errno
Eq Fd
Eq CRLim
Eq CTcflag
Eq CSpeed
Eq CCc
Eq CUid
Eq CNlink
Eq CGid
Eq CSsize
Eq CPid
Eq COff
Eq CMode
Eq CIno
Eq CDev
Eq ThreadStatus
Eq BlockReason
Eq ThreadId
Eq IOMode
Eq Lifetime
Eq Event
Eq FdKey
Eq TimeoutKey
Eq HandlePosn
Eq Version
Eq Fixity
Eq ConstrRep
Eq DataRep
Eq Конструктор

Равенство конструкторов

Eq Natural
Eq SomeSymbol
Eq SomeNat
Eq SrcLoc
Eq SpecConstrAnnotation
Eq Уникальный
Eq Void
Eq a => Eq [a]
Eq a => Eq (Ratio a)
Eq (StablePtr a)
Eq (Ptr a)
Eq (FunPtr a)
Eq (U1 p)
Eq p => Eq (Par1 p)
Eq a => Eq (Возможно a)
Eq a => Eq (Down a)
Eq a => Eq (Последний a)
Eq a => Eq (Первый a)
Eq a => Eq (Произведение a)
Eq a => Eq (Сумма a)
Eq a => Eq (Двойственный a)
Eq (MVar a)
Eq (IORef a)
Eq (ForeignPtr a)
Eq (TVar a)
Eq a => Eq (ZipList a)
Eq (Chan a)
Eq a => Eq (Комплексное a)
Eq (Fixed a)
Eq a => Eq (Тождество a)
Eq (StableName a)
(Eq a, Eq b) => Eq (Либо a b)
Eq (f p) => Eq (Rec1 f p)
(Eq a, Eq b) => Eq (a, b)
Eq (STRef s a)
Eq (Прокси k s)
Eq a => Eq (Постоянное a b)
Eq c => Eq (K1 i c p)
(Eq (f p), Eq (g p)) => Eq ((:+:) f g p)
(Eq (f p), Eq (g p)) => Eq ((:*:) f g p)
Eq (f (g p)) => Eq ((:.:) f g p)
(Eq a, Eq b, Eq c) => Eq (a, b, c)
Eq ((:~:) k a b)
Eq (Преобразование k a b)
Eq (f a) => Eq (Alt k f a)
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 может быть более эффективным для сложных типов.

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

compare | (<=)

Методы

compare :: a -> a -> Ordering Source

(<) :: a -> a -> Bool infix 4 Source

(<=) :: a -> a -> Bool infix 4 Source

(>) :: a -> a -> Bool infix 4 Source

(>=) :: a -> a -> Bool infix 4 Source

max :: a -> a -> a Source

min :: a -> a -> a Source

Экземпляры

Ord Bool
Ord Char
Ord Double
Ord Float
Ord Int
Ord Int8
Ord Int16
Ord Int32
Ord Int64
Ord Integer
Ord Ordering
Ord Word
Ord Word8
Ord Word16
Ord Word32
Ord Word64
Ord TypeRep
Ord ()
Ord BigNat
Ord GeneralCategory
Ord Fingerprint
Ord TyCon
Ord Associativity
Ord Fixity
Ord Arity
Ord Any
Ord All
Ord ArithException
Ord ErrorCall
Ord CUIntMax
Ord CIntMax
Ord CUIntPtr
Ord CIntPtr
Ord CSUSeconds
Ord CUSeconds
Ord CTime
Ord CClock
Ord CSigAtomic
Ord CWchar
Ord CSize
Ord CPtrdiff
Ord CDouble
Ord CFloat
Ord CULLong
Ord CLLong
Ord CULong
Ord CLong
Ord CUInt
Ord CInt
Ord CUShort
Ord CShort
Ord CUChar
Ord CSChar
Ord CChar
Ord IntPtr
Ord WordPtr
Ord SeekMode
Ord NewlineMode
Ord Newline
Ord BufferMode
Ord ExitCode
Ord ArrayException
Ord AsyncException
Ord Fd
Ord CRLim
Ord CTcflag
Ord CSpeed
Ord CCc
Ord CUid
Ord CNlink
Ord CGid
Ord CSsize
Ord CPid
Ord COff
Ord CMode
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)

class Enum a where Source

Класс 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

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

toEnum, fromEnum

Методы

succ :: a -> a Source

преемник значения. Для числовых типов succ добавляет 1.

pred :: a -> a Source

предшественник значения. Для числовых типов pred вычитает 1.

toEnum :: Int -> a Source

Преобразование из Int.

fromEnum :: a -> Int Source

Преобразование в Int. То, что возвращает fromEnum при применении к значению, которое слишком велико для размещения в Int, зависит от реализации.

enumFrom :: a -> [a] Source

Используется в 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.

Методы

minBound, maxBound :: a Source

Экземпляры

Bounded Bool
Bounded Char
Bounded Int
Bounded Int8
Bounded Int16
Bounded Int32
Bounded Int64
Bounded Ordering
Bounded Word
Bounded Word8
Bounded Word16
Bounded Word32
Bounded Word64
Bounded ()
Bounded GeneralCategory
Bounded Any
Bounded All
Bounded CUIntMax
Bounded CIntMax
Bounded CUIntPtr
Bounded CIntPtr
Bounded CSigAtomic
Bounded CWchar
Bounded CSize
Bounded CPtrdiff
Bounded CULLong
Bounded CLLong
Bounded CULong
Bounded CLong
Bounded CUInt
Bounded CInt
Bounded CUShort
Bounded CShort
Bounded CUChar
Bounded CSChar
Bounded CChar
Bounded IntPtr
Bounded WordPtr
Bounded Fd
Bounded CRLim
Bounded CTcflag
Bounded CUid
Bounded CNlink
Bounded CGid
Bounded CSsize
Bounded CPid
Bounded COff
Bounded CMode
Bounded CIno
Bounded CDev
Bounded a => Bounded (Product a)
Bounded a => Bounded (Sum a)
Bounded a => Bounded (Dual a)
(Bounded a, Bounded b) => Bounded (a, b)
Bounded (Proxy k s)
(Bounded a, Bounded b, Bounded c) => Bounded (a, b, c)
(~) k a b => Bounded ((:~:) k a b)
Coercible k a b => Bounded (Coercion k a b)
(Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d)
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) => Bounded (a, b, c, d, e)
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f) => Bounded (a, b, c, d, e, f)
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g) => Bounded (a, b, c, d, e, f, g)
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f, Bounded g, Bounded h) => Bounded (a, b, c, d, e, f, g, h)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i) => Ограниченный (a, b, c, d, e, f, g, h, i)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j) => Ограниченный (a, b, c, d, e, f, g, h, i, j)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j, Ограниченный k) => Ограниченный (a, b, c, d, e, f, g, h, i, j, k)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j, Ограниченный k, Ограниченный l) => Ограниченный (a, b, c, d, e, f, g, h, i, j, k, l)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j, Ограниченный k, Ограниченный l, Ограниченный m) => Ограниченный (a, b, c, d, e, f, g, h, i, j, k, l, m)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j, Ограниченный k, Ограниченный l, Ограниченный m, Ограниченный n) => Ограниченный (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
(Ограниченный a, Ограниченный b, Ограниченный c, Ограниченный d, Ограниченный e, Ограниченный f, Ограниченный g, Ограниченный h, Ограниченный i, Ограниченный j, Ограниченный k, Ограниченный l, Ограниченный m, Ограниченный n, Ограниченный o) => Ограниченный (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)

Числа

Числовые типы

data Int :: * Source

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

Примеры

Ограниченный Int
Перечисление Int
Равенство Int
Целочисленный Int
Данные Int
Числовой Int
Порядок Int
Чтение Int
Вещественный Int
Вывод Int
Индекс Int
Обобщенный Int
Конечные биты Int
Биты Int
Хранимая Int
АргументPrintf Int
type Представление Int

data Integer :: * Source

Инвариант: Jn# и Jp# используются, если значение не помещается в S#

Полезные свойства, вытекающие из инвариантов:

  • abs (S# _) <= abs (Jp# _)
  • abs (S# _) <  abs (Jn# _)

Примеры

Перечисление Integer
Равенство Integer
Целочисленный Integer
Данные Integer
Числовой Integer
Порядок Integer
Чтение Integer
Вещественный Integer
Вывод Integer
Индекс Integer
Биты Integer
АргументPrintf Integer

data Float :: * Source

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

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

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

data Double :: * Источник

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

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

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

type Рациональное число = Ratio Целое число Источник

Рациональные числа произвольной точности, представленные как отношение двух Integer значений. Рациональное число можно построить, используя оператор %.

data Целочисленное беззнаковое слово :: * Источник

Беззнаковое целочисленное значение с размером, совпадающим с размером Int.

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

Ограниченный Целочисленное беззнаковое слово
Перечислимый Целочисленное беззнаковое слово
Равенство Целочисленное беззнаковое слово
Целочисленный Целочисленное беззнаковое слово
Data Целочисленное беззнаковое слово
Числовой Целочисленное беззнаковое слово
Порядковый Целочисленное беззнаковое слово
Чтение Целочисленное беззнаковое слово
Вещественный Целочисленное беззнаковое слово
Вывод Целочисленное беззнаковое слово
Индекс Целочисленное беззнаковое слово
Конечные биты Целочисленное беззнаковое слово
Биты Целочисленное беззнаковое слово
Storable Целочисленное беззнаковое слово
PrintfArg Целочисленное беззнаковое слово

Числовые классы

class Числовой a где Источник

Базовый числовой класс.

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

(+), (*), abs, signum, fromInteger, (negate | (-))

Методы

(+), (-), (*) :: a -> a -> a infixl 7 *infixl 6 +, - Источник

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

Унарное отрицание.

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

Модуль числа.

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

Знак числа. Функции 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 Источник

рациональное эквивалент действительного аргумента с полной точностью

Примеры реализации

Real Int
Real Int8
Real Int16
Real Int32
Real Int64
Real Integer
Real Word
Real Word8
Real Word16
Real Word32
Real Word64
Real CUIntMax
Real CIntMax
Real CUIntPtr
Real CIntPtr
Real CSUSeconds
Real CUSeconds
Real CTime
Real CClock
Real CSigAtomic
Real CWchar
Real CSize
Real CPtrdiff
Real CDouble
Real CFloat
Real CULLong
Real CLLong
Real CULong
Real CLong
Real CUInt
Real CInt
Real CUShort
Real CShort
Real CUChar
Real CSChar
Real CChar
Real IntPtr
Real WordPtr
Real Fd
Real CRLim
Real CTcflag
Real CSpeed
Real CCc
Real CUid
Real CNlink
Real CGid
Real CSsize
Real CPid
Real COff
Real CMode
Real CIno
Real CDev
Real Natural
Integral a => Real (Ratio a)
HasResolution a => Real (Fixed a)

class (Real a, Enum a) => Целочисленный a где Источник

Целые числа, поддерживающие целочисленное деление.

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

quotRem, toInteger

Методы

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

Примеры

Целочисленный Int
Целочисленный Int8
Целочисленный Int16
Целочисленный Int32
Целочисленный Int64
Целочисленный Integer
Целочисленный Word
Целочисленный Word8
Целочисленный Word16
Целочисленный Word32
Целочисленный Word64
Целочисленный CUIntMax
Целочисленный CIntMax
Целочисленный CUIntPtr
Целочисленный CIntPtr
Целочисленный CSigAtomic
Целочисленный CWchar
Целочисленный CSize
Целочисленный CPtrdiff
Целочисленный CULLong
Целочисленный CLLong
Целочисленный CULong
Целочисленный CLong
Целочисленный CUInt
Целочисленный CInt
Целочисленный CUShort
Целочисленный CShort
Целочисленный CUChar
Целочисленный CSChar
Целочисленный CChar
Целочисленный IntPtr
Целочисленный WordPtr
Целочисленный Fd
Целочисленный CRLim
Целочисленный CTcflag
Целочисленный CUid
Целочисленный CNlink
Целочисленный CGid
Целочисленный CSsize
Целочисленный CPid
Целочисленный COff
Целочисленный CMode
Целочисленный CIno
Целочисленный CDev
Целочисленный Натуральное

класс Num a => Дробный a где Источник

Дробные числа, поддерживающие действительное деление.

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

fromRational, (recip | (/))

Методы

(/) :: a -> a -> a infixl 7 Источник

Дробное деление

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

Обратная дробь

fromRational :: Рациональное -> a Источник

Преобразование из Rational (то есть Ratio Integer). Число с плавающей точкой обозначает применение fromRational к значению типа Rational, поэтому такие литералы имеют тип (Fractional a) => a.

Примеры

Дробный CDouble
Дробный CFloat
Целочисленный a => Дробный (Соотношение a)
Вещественный с плавающей точкой a => Дробный (Комплексное a)
HasResolution a => Дробный (Fixed a)

класс Дробный a => Плавающий a где Источник

Тригонометрические и гиперболические функции и связанные функции.

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

π, exp, log, sin, cos, asin, acos, atan, sinh, cosh, asinh, acosh, atanh

Методы

pi :: a Источник

exp, log, sqrt :: a -> a Источник

(**), logBase :: a -> a -> a infixr 8 Источник

sin, cos, tan :: a -> a Источник

asin, acos, atan :: a -> a Источник

sinh, cosh, tanh :: a -> a Источник

asinh, acosh, atanh :: a -> a Источник

Примеры

Floating Double
Floating Float
Floating CDouble
Floating CFloat
RealFloat a => Floating (Complex a)

class (Real a, Fractional a) => RealFrac a where Источник

Извлечение компонентов дробей.

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

properFraction

Методы

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

Примеры

RealFrac CDouble
RealFrac CFloat
Integral a => RealFrac (Ratio a)
HasResolution a => RealFrac (Fixed a)

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 :: a -> Int Source

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

умножает число с плавающей запятой на целую степень основания

isNaN :: a -> Bool Source

True если аргумент — значение IEEE «не число» (NaN)

isInfinite :: a -> Bool Source

True если аргумент — бесконечность IEEE или отрицательная бесконечность

isDenormalized :: a -> Bool Source

True если аргумент слишком мал, чтобы быть представленным в нормализованном формате

isNegativeZero :: a -> Bool Source

True если аргумент — отрицательный ноль IEEE

isIEEE :: a -> Bool Source

True если аргумент — число с плавающей запятой IEEE

atan2 :: a -> a -> a Source

вариант арктангенса, принимающий два вещественных аргумента с плавающей запятой. Для вещественных чисел с плавающей запятой x и y, atan2 y x вычисляет угол (от положительной оси x) вектора от начала координат до точки (x,y). atan2 y x возвращает значение в диапазоне [-pi, pi]. Следует семантике Common Lisp для начала координат, когда поддерживаются знаковые нули. atan2 y 1, с y в типе, который RealFloat, должен возвращать то же значение, что и atan y. Представлено стандартное определение atan2, но реализаторы могут предоставить более точную реализацию.

Примеры

RealFloat Double
RealFloat Float
RealFloat CDouble
RealFloat CFloat

Числовые функции

subtract :: Num a => a -> a -> a Source

то же самое, что и flip (-).

Поскольку - обрабатывается специально в грамматике 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

общее приведение к типам с плавающей точкой

Моноиды

class Monoid a where Source

Класс моноидов (типы с ассоциативной бинарной операцией, имеющей единицу). Экземпляры должны удовлетворять следующим законам:

  • mappend mempty x = x
  • mappend x mempty = x
  • mappend x (mappend y z) = mappend (mappend x y) z
  • mconcat = foldr mappend mempty

Названия методов относятся к моноиду списков при конкатенации, но существует много других экземпляров.

Некоторые типы могут рассматриваться как моноид более чем одним способом, например, как сложение, так и умножение чисел. В таких случаях мы часто определяем newtypes и делаем эти экземпляры Monoid, например Sum и Product.

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

mempty, mappend

Методы

mempty :: a Source

Единица mappend

mappend :: a -> a -> a Source

Ассоциативная операция

mconcat :: [a] -> a Source

Сворачивает список, используя моноид. Для большинства типов будет использовано стандартное определение для mconcat, но функция включена в определение класса, чтобы можно было предоставить оптимизированную версию для конкретных типов.

Экземпляры

Monoid Ordering
Monoid ()
Monoid Any
Monoid All
Monoid Lifetime

mappend == elSupremum

Monoid Event
Monoid [a]
Monoid a => Monoid (Maybe a)

Поднимает полугруппу в Maybe, образуя Monoid в соответствии с http://en.wikipedia.org/wiki/Monoid: "Любая полугруппа S может быть превращена в моноид простым добавлением элемента e, не входящего в S, и определением e*e = e и e*s = s = s*e для всех s ∈ S." Поскольку нет класса типов "Semigroup", предоставляющего только mappend, мы используем Monoid вместо этого.

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)

Моноиды и функторы

class Functor f where Source

Класс Functor используется для типов, по которым можно выполнять отображение. Экземпляры Functor должны удовлетворять следующим законам:

fmap id  ==  id
fmap (f . g)  ==  fmap f . fmap g

Экземпляры Functor для списков, Maybe и IO удовлетворяют этим законам.

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

fmap

Методы

fmap :: (a -> b) -> f a -> f b Source

(<$) :: a -> f b -> f a infixl 4 Source

Замените все места в вводе на одно и то же значение. Стандартное определение — fmap . const, но его можно переопределить более эффективной версией.

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

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 <$> Nothing
Nothing
>>> show <$> Just 3
Just "3"

Преобразование из Either Int Int в Either Int String с помощью show:

>>> show <$> Left 17
Left 17
>>> show <$> Right 17
Right "17"

Удвоение каждого элемента в списке:

>>> (*2) <$> [1,2,3]
[2,4,6]

Применение even ко второму элементу пары:

>>> even <$> (2,2)
(2,True)

class Functor f => Applicative f where Источник

Функтор с применением, предоставляющий операции для

  • встраивания чистых выражений (pure), и
  • последовательного выполнения вычислений и объединения их результатов (<*>).

Минимальное полное определение должно включать реализации этих функций, удовлетворяющие следующим законам:

тождество
pure id <*> v = v
композиция
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
гомоморфизм
pure f <*> pure x = pure (f x)
перестановка
u <*> pure y = pure ($ y) <*> u

Другие методы имеют следующие определения по умолчанию, которые могут быть переопределены эквивалентными специализированными реализациями:

  • u *> v = pure (const id) <*> u <*> v
  • u <* v = pure const <*> u <*> v

Вследствие этих законов, Functor экземпляр для f будет удовлетворять

  • fmap f x = pure f <*> x

Если f также является Monad, оно должно удовлетворять

  • pure = return
  • (<*>) = ap

(что подразумевает, что pure и <*> удовлетворяют законам функтора с применением).

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

pure, (<*>)

Методы

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

Поднятие значения.

(<*>) :: 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 должны удовлетворять следующим законам:

  • return a >>= k  =  k a
  • m >>= return  =  m
  • m >>= (x -> k x >>= h)  =  (m >>= k) >>= h

Кроме того, операции Monad и Applicative должны быть связаны следующим образом:

  • pure = return
  • (<*>) = ap

Вышеупомянутые законы подразумевают:

  • fmap f xs  =  xs >>= return . f
  • (>>) = (*>)

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

Последовательно объединяет два действия, отбрасывая любое значение, произведённое первым, подобно операторам последовательности (например, точка с запятой) в императивных языках.

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

Вводит значение в тип монады.

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

То же, что и >>=, но с переставленными аргументами.

Склады и обходы

class Foldable t where Source

Структуры данных, которые можно сложить.

Например, задан тип данных

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 | foldr

Методы

foldMap :: Monoid m => (a -> m) -> t a -> m Source

Применяет к каждому элементу структуры функцию, преобразующую его в элемент моноида, и объединяет результаты.

foldr :: (a -> b -> b) -> b -> t a -> b Source

Сворачивание структуры справа налево.

foldr f z = foldr f z . toList

foldl :: (b -> a -> b) -> b -> t a -> b Source

Сворачивание структуры слева направо.

foldl f z = foldl f z . toList

foldr1 :: (a -> a -> a) -> t a -> a Source

Вариант foldr, не имеющий базового случая, и поэтому может быть применён только к непустым структурам.

foldr1 f = foldr1 f . toList

foldl1 :: (a -> a -> a) -> t a -> a Source

Вариант foldl, не имеющий базового случая, и поэтому может быть применён только к непустым структурам.

foldl1 f = foldl1 f . toList

null :: t a -> Bool Source

Проверка, пуста ли структура. По умолчанию реализация оптимизирована для структур, похожих на списки, потому что нет общего способа сделать лучше.

length :: t a -> Int Source

Возвращает размер/длину конечной структуры как 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 вычисляет произведение чисел в структуре.

Экземпляры

Foldable []
Foldable Maybe
Foldable Identity
Foldable (Either a)
Foldable ((,) a)
Foldable (Proxy *)
Foldable (Const m)

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, т.е.

  • t (pure x) = pure x
  • t (x <*> y) = t x <*> t y

и тождественный функтор 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 | sequenceA

Методы

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)

Разные функции

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

Функция тождества.

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

Функция константы.

(.) :: (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 :: [Char] -> a Источник

error останавливает выполнение и отображает сообщение об ошибке.

undefined :: a Источник

Особый случай error. Ожидается, что компиляторы распознают это и вставят сообщения об ошибках, более подходящие к контексту, в котором undefined появляется.

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

Значение 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]

head :: [a] -> a Источник

Извлечение первого элемента списка, который должен быть непустым.

last :: [a] -> a Источник

Извлечение последнего элемента списка, который должен быть конечным и непустым.

tail :: [a] -> [a] Источник

Извлечение элементов после первого элемента списка, который должен быть непустым.

init :: [a] -> [a] Источник

Возвращение всех элементов списка, кроме последнего. Список должен быть непустым.

(!!) :: [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 :: a -> [a] Source

repeat x — это бесконечный список, где значение каждого элемента — x.

replicate :: Int -> a -> [a] Source

replicate n x — это список длиной n со значением x каждого элемента. Он является примером более общей genericReplicate, в которой n может быть любого целочисленного типа.

cycle :: [a] -> [a] Source

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

notElem — это отрицание elem.

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. Это позволяет выполнять конкатенацию результатов с использованием композиции функций за постоянное время.

class Show a where Source

Преобразование значений в удобочитаемые 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)".

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

showsPrec | show

Методы

showsPrec Source

Аргументы

:: Int

приоритет оператора окружающего контекста (число от 0 до 11). Приоритет применения функции — 10.

-> a

значение, которое нужно преобразовать в String

-> ShowS

Преобразование значения в удобочитаемое String.

showsPrec должно удовлетворять закону

showsPrec d x r ++ s  ==  showsPrec d x (r ++ s)

Производные экземпляры Read и Show удовлетворяют следующим:

  • (x,"") является элементом (readsPrec d (showsPrec d x "")).

То есть, readsPrec парсит строку, произведённую showsPrec, и возвращает значение, с которым showsPrec начинало.

show :: a -> String Source

Специализированная версия showsPrec, использующая контекст приоритета ноль и возвращающая обычную String.

showList :: [a] -> ShowS Source

Метод showList предоставляет возможность программисту указать специализированный способ отображения списков значений. Например, он используется предопределённым экземпляром Show типа Char, где значения типа String должны отображаться в двойных кавычках, а не в квадратных скобках.

Экземпляры

Show Bool
Show Char
Show Int
Show Int8
Show Int16
Show Int32
Show Int64
Show Integer
Show Ordering
Show Word
Show Word8
Show Word16
Show Word32
Show Word64
Show CallStack
Show TypeRep
Show ()
Show SomeException
Show Number
Show Lexeme
Show GeneralCategory
Show Fingerprint
Show TyCon
Show Associativity
Show Fixity
Show Arity
Show Any
Show All
Show ArithException
Show ErrorCall
Show IOException
Show MaskingState
Show Dynamic
Show CUIntMax
Show CIntMax
Show CUIntPtr
Show CIntPtr
Show CSUSeconds
Show CUSeconds
Show CTime
Show CClock
Show CSigAtomic
Show CWchar
Show CSize
Show CPtrdiff
Show CDouble
Show CFloat
Show CULLong
Show CLLong
Show CULong
Show CLong
Show CUInt
Show CInt
Show CUShort
Show CShort
Show CUChar
Show CSChar
Show CChar
Show IntPtr
Show WordPtr
Show CodingProgress
Show TextEncoding
Show SeekMode
Show NewlineMode
Show Newline
Show BufferMode
Show Handle
Show IOErrorType
Show ExitCode
Show ArrayException
Show AsyncException
Show SomeAsyncException
Show AssertionFailed
Show Превышение предела выделения памяти
Show Тупиковая ситуация
Show Заблокировано неопределённое время на STM
Show Заблокировано неопределённое время на MVar
Show Fd
Show CRLim
Show CTcflag
Show CSpeed
Show CCc
Show CUid
Show CNlink
Show CGid
Show CSsize
Show CPid
Show COff
Show CMode
Show CIno
Show CDev
Show Режим ошибки кодирования
Show Статус потока
Show Причина блокировки
Show Идентификатор потока
Show Вложенная атомность
Show Непрекращающаяся работа
Show Ошибка отсутствия метода
Show Ошибка обновления записи
Show Ошибка создания записи
Show Ошибка выбора записи
Show Ошибка совпадения шаблона
Show Режим Ввода/Вывода
Show Срок службы
Show Событие
Show Ключ файла
Show Позиция в файле
Show Статистика GC
Show Версия
Show Связанность
Show Представление конструктора
Show Представление данных
Show Конструктор
Show Тип данных
Show Естественное число
Show Флаги RTS
Show Флаги Ticky
Show Флаги отслеживания
Show Включить отслеживание
Show Флаги профилирования
Show Включить профилирование кучи
Show Флаги компилятора
Show Включить центры затрат
Show Флаги отладки
Show Разные флаги
Show Флаги конкурентности
Show Флаги сборки мусора
Show Вывести статистику сборки мусора
Show Некоторые символы
Show Некоторые натуральные числа
Show Местоположение исходного кода
Show Информация о статических указателях
Show Пустота
Show a => Show [a]
(Integral a, Show a) => Show (Ratio a)
Show (Ptr a)
Show (FunPtr a)
Show (U1 p)
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)

Этот экземпляр был бы эквивалентен производным экземплярам нового типа Identity если бы поле runIdentity было удалено

(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).

class Read a where Source

Парсинг 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

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

readsPrec | readPrec

Методы

readsPrec Source

Аргументы

:: Int

приоритет оператора окружающего контекста (число от 0 до 11). Приоритет применения функции равен 10.

-> ReadS a

пытается разобрать значение из начала строки, возвращая список пар (разборённое значение, оставшаяся строка). Если разбор невозможен, возвращаемый список пуст.

Производные экземпляры Read и Show удовлетворяют следующим:

  • (x,"") является элементом (readsPrec d (showsPrec d x "")).

То есть, readsPrec разбирает строку, сгенерированную showsPrec, и предоставляет значение, с которым showsPrec начал.

readList :: ReadS [a] Source

Метод readList предоставляется для возможности программисту предоставить специализированный способ разбора списков значений. Например, это используется экземпляром Read предопределённого типа Char, где значения типа String должны использовать двойные кавычки, а не квадратные скобки.

Экземпляры

Read Bool
Read Char
Read Double
Read Float
Read Int
Read Int8
Read Int16
Read Int32
Read Int64
Read Integer
Read Ordering
Read Word
Read Word8
Read Word16
Read Word32
Read Word64
Read ()
Read Lexeme
Read GeneralCategory
Read Associativity
Read Fixity
Read Arity
Read Any
Read All
Read CUIntMax
Read CIntMax
Read CUIntPtr
Read CIntPtr
Read CSUSeconds
Read CUSeconds
Read CTime
Read CClock
Read CSigAtomic
Read CWchar
Read CSize
Read CPtrdiff
Read CDouble
Read CFloat
Read CULLong
Read CLLong
Read CULong
Read CLong
Read CUInt
Read CInt
Read CUShort
Read CShort
Read CUChar
Read CSChar
Read CChar
Read IntPtr
Read WordPtr
Read SeekMode
Read NewlineMode
Read Newline
Read BufferMode
Read ExitCode
Read Fd
Read CRLim
Read CTcflag
Read CSpeed
Read CCc
Read CUid
Read CNlink
Read CGid
Read CSsize
Read CPid
Read COff
Read CMode
Read CIno
Read CDev
Read IOMode
Read GCStats
Read Version
Read Natural
Read SomeSymbol
Read SomeNat
Read Void

Чтение значения Void всегда является ошибкой синтаксического анализа, рассматривая Void как тип данных без конструкторов.

Read a => Read [a]
(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)

Этот экземпляр был бы эквивалентен производным экземплярам Identity newtype, если бы поле runIdentity было удалено

(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 :: ReadS String Source

Функция lex считывает одно лексему из входных данных, игнорируя начальные пробелы и возвращая символы, составляющие лексему. Если строка ввода содержит только пробелы, lex возвращает одну успешную `лексему`, состоящую из пустой строки. (Таким образом lex "" = [("","")].) Если в начале строки ввода нет законной лексемы, lex терпит неудачу (т. е. возвращает []).

Этот лексический анализатор не полностью соответствует синтаксису Haskell по следующим аспектам:

  • Квалифицированные имена не обрабатываются должным образом
  • Восьмеричные и шестнадцатеричные числа не распознаются как один токен
  • Комментарии не обрабатываются должным образом

Основные операции ввода и вывода

data IO a :: * -> * Source

Значение типа 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]])

Функции ввода

getChar :: IO Char Source

Считывает символ из стандартного устройства ввода (то же, что hGetChar stdin).

getLine :: IO String Source

Считывает строку из стандартного устройства ввода (то же, что hGetLine stdin).

getContents :: IO String Source

Операция getContents возвращает все входные данные пользователя в виде одной строки, которая считывается лениво по мере необходимости (то же, что hGetContents stdin).

interact :: (String -> String) -> IO () Source

Функция interact принимает функцию типа String->String в качестве аргумента. Весь ввод со стандартного устройства ввода передается в эту функцию в качестве аргумента, а результирующая строка выводится на стандартное устройство вывода.

Файлы

type FilePath = String Source

Имена файлов и каталогов являются значениями типа 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

Вызвать IOError в IO монаде.

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

Spec-Zone.ru

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