Spec-Zone.ru › Haskell 9

GHC.List

Авторские права (c) The University of Glasgow 1994-2002
Лицензия см. libraries/base/LICENSE
Ответственный за поддержку ghc-devs@haskell.org
Стабильность внутренняя
Переносимость непереносимый (расширения GHC)
Безопасный Haskell Безопасный
Язык Haskell2010

Содержание

  • Тип данных списка
  • Методы Foldable для списков и прочие функции
  • Другие функции
  • Слияние списков GHC

Описание

Тип данных списка и операции над ним

Тип данных списка

data List a Источник

Встроенный тип связного списка.

В Haskell списки являются одним из важнейших типов данных, поскольку их часто используют подобно циклам в императивных языках программирования. Эти списки являются односвязными, поэтому они не подходят для операций, требующих доступа за \(\mathcal{O}(1)\). Вместо этого они предназначены для обхода.

В сигнатурах типов можно использовать List a или [a]:

length :: [a] -> Int

или

length :: List a -> Int

Они полностью эквивалентны, и List a будет нормализовано до [a].

Использование

Списки строятся рекурсивно с помощью правоассоциативного оператора-конструктора (или cons) (:) :: a -> [a] -> [a], который добавляет элемент в начало списка, и пустого списка [].

(1 : 2 : 3 : []) == (1 : (2 : (3 : []))) == [1, 2, 3]

Списки также можно создавать с помощью списковых литералов вида [x_1, x_2, ..., x_n]. Это синтаксический сахар, который, если не включён параметр -XOverloadedLists, преобразуется в выражения с использованием (:) и []

Литералы String, например "I 💜 hs", преобразуются в списки символов, ['I', ' ', '💜', ' ', 'h', 's'].

Реализация
Развернуть

Внутри программы и в памяти всё перечисленное выше представлено следующим образом; стрелки указывают на адреса в памяти.

╭───┬───┬──╮   ╭───┬───┬──╮   ╭───┬───┬──╮   ╭────╮
│(:)│   │ ─┼──>│(:)│   │ ─┼──>│(:)│   │ ─┼──>│ [] │
╰───┴─┼─┴──╯   ╰───┴─┼─┴──╯   ╰───┴─┼─┴──╯   ╰────╯
      v              v              v
      1              2              3
Примеры
Развернуть
>>> ['H', 'a', 's', 'k', 'e', 'l', 'l']
"Haskell"
>>> 1 : [4, 1, 5, 9]
[1,4,1,5,9]
>>> [] : [] : []
[[],[]]

Начиная с: ghc-internal-0.10.0

Экземпляры
Подробности экземпляров
Eq1 [] Исходный код

Начиная с: base-4.9.0.0

Подробности экземпляра

Определён в Data.Functor.Classes

Методы

liftEq :: (a -> b -> Bool) -> [a] -> [b] -> Bool Исходный код

Ord1 [] Исходный код

Начиная с: base-4.9.0.0

Подробности экземпляра

Определён в Data.Functor.Classes

Методы

liftCompare :: (a -> b -> Ordering) -> [a] -> [b] -> Ordering Исходный код

Read1 [] Исходный код

Начиная с: base-4.9.0.0

Подробности экземпляра

Определён в Data.Functor.Classes

Методы

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS [a] Исходный код

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [[a]] Исходный код

liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [a] Исходный код

liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [[a]] Исходный код

Show1 [] Исходный код

Начиная с: base-4.9.0.0

Подробности экземпляра

Определён в Data.Functor.Classes

Методы

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> [a] -> ShowS Исходный код

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [[a]] -> ShowS Исходный код

Alternative [] Исходный код

Объединяет списки конкатенацией, начиная с пустого списка.

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Base

Методы

empty :: [a] Исходный код

(<|>) :: [a] -> [a] -> [a] Исходный код

some :: [a] -> [[a]] Исходный код

many :: [a] -> [[a]] Исходный код

Applicative [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Base

Методы

pure :: a -> [a] Исходный код

(<*>) :: [a -> b] -> [a] -> [b] Исходный код

liftA2 :: (a -> b -> c) -> [a] -> [b] -> [c] Исходный код

(*>) :: [a] -> [b] -> [b] Исходный код

(<*) :: [a] -> [b] -> [a] Исходный код

Functor [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Base

Методы

fmap :: (a -> b) -> [a] -> [b] Исходный код

(<$) :: a -> [b] -> [a] Исходный код

Monad [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Base

Методы

(>>=) :: [a] -> (a -> [b]) -> [b] Исходный код

(>>) :: [a] -> [b] -> [b] Исходный код

return :: a -> [a] Исходный код

MonadPlus [] Исходный код

Объединяет списки конкатенацией, начиная с пустого списка.

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Base

Методы

mzero :: [a] Исходный код

mplus :: [a] -> [a] -> [a] Исходный код

MonadFail [] Исходный код

Начиная с: base-4.9.0.0

Подробности экземпляра

Определён в GHC.Internal.Control.Monad.Fail

Методы

fail :: HasCallStack => String -> [a] Исходный код

MonadFix [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Control.Monad.Fix

Методы

mfix :: (a -> [a]) -> [a] Исходный код

MonadZip [] Исходный код

Начиная с: ghc-internal-4.3.1.0

Подробности экземпляра

Определён в GHC.Internal.Control.Monad.Zip

Методы

mzip :: [a] -> [b] -> [(a, b)] Исходный код

mzipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Исходный код

munzip :: [(a, b)] -> ([a], [b]) Исходный код

Foldable [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Data.Foldable

Методы

fold :: Monoid m => [m] -> m Исходный код

foldMap :: Monoid m => (a -> m) -> [a] -> m Исходный код

foldMap' :: Monoid m => (a -> m) -> [a] -> m Исходный код

foldr :: (a -> b -> b) -> b -> [a] -> b Исходный код

foldr' :: (a -> b -> b) -> b -> [a] -> b Исходный код

foldl :: (b -> a -> b) -> b -> [a] -> b Исходный код

foldl' :: (b -> a -> b) -> b -> [a] -> b Исходный код

foldr1 :: (a -> a -> a) -> [a] -> a Исходный код

foldl1 :: (a -> a -> a) -> [a] -> a Исходный код

toList :: [a] -> [a] Исходный код

null :: [a] -> Bool Исходный код

length :: [a] -> Int Исходный код

elem :: Eq a => a -> [a] -> Bool Исходный код

maximum :: Ord a => [a] -> a Исходный код

minimum :: Ord a => [a] -> a Исходный код

sum :: Num a => [a] -> a Исходный код

product :: Num a => [a] -> a Исходный код

Traversable [] Исходный код

Начиная с: base-2.1

Подробности экземпляра

Определён в GHC.Internal.Data.Traversable

Методы

traverse :: Applicative f => (a -> f b) -> [a] -> f [b] Исходный код

sequenceA :: Applicative f => [f a] -> f [a] Исходный код

mapM :: Monad m => (a -> m b) -> [a] -> m [b] Исходный код

sequence :: Monad m => [m a] -> m [a] Исходный код

Generic1 [] Исходный код
Подробности экземпляра

Определён в GHC.Internal.Generics

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

type Rep1 []

Начиная с: base-4.6.0.0

Подробности экземпляра

Определён в GHC.Internal.Generics

type Rep1 [] = D1 ('MetaData "List" "GHC.Internal.Types" "ghc-internal" 'False) (C1 ('MetaCons "[]" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons ":" ('InfixI 'RightAssociative 5) 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 [])))

Методы

from1 :: [a] -> Rep1 [] a Исходный код

to1 :: Rep1 [] a -> [a] Исходный код

Lift a => Lift ([a] :: Type) Исходный код
Подробности экземпляра

Определено в GHC.Internal.TH.Lift

Методы

lift :: Quote m => [a] -> m Exp Источник

liftTyped :: forall (m :: Type -> Type). Quote m => [a] -> Code m [a] Источник

IsChar c => PrintfArg [c] Источник

С версии: base-2.1

Подробности экземпляра

Определено в Text.Printf

Методы

formatArg :: [c] -> FieldFormatter Источник

parseFormat :: [c] -> ModifierParser Источник

IsChar c => PrintfType [c] Источник

С версии: base-2.1

Подробности экземпляра

Определено в Text.Printf

Методы

spr :: String -> [UPrintf] -> [c]

Monoid [a] Источник

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Base

Методы

mempty :: [a] Источник

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

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

Semigroup [a] Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Base

Методы

(<>) :: [a] -> [a] -> [a] Источник

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

stimes :: Integral b => b -> [a] -> [a] Источник

Eq a => Eq [a] Источник
Подробности экземпляра

Определено в GHC.Internal.Classes

Методы

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

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

Ord a => Ord [a] Источник
Подробности экземпляра

Определено в GHC.Internal.Classes

Методы

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

(<) :: [a] -> [a] -> Bool Источник

(<=) :: [a] -> [a] -> Bool Источник

(>) :: [a] -> [a] -> Bool Источник

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

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

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

Data a => Data [a] Источник

По историческим причинам имя конструктора, используемое для (:), — "(:)". В производном экземпляре это было бы ":".

С версии: base-4.0.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Data

Методы

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> [a] -> c [a] Источник

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c [a] Источник

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

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

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c [a]) Источник

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c [a]) Источник

gmapT :: (forall b. Data b => b -> b) -> [a] -> [a] Источник

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> [a] -> r Источник

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> [a] -> r Источник

gmapQ :: (forall d. Data d => d -> u) -> [a] -> [u] Источник

gmapQi :: Int -> (forall d. Data d => d -> u) -> [a] -> u Источник

gmapM :: Monad m => (forall d. Data d => d -> m d) -> [a] -> m [a] Источник

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> [a] -> m [a] Источник

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> [a] -> m [a] Источник

a ~ Char => IsString [a] Источник

Контекст (a ~ Char) был добавлен в 4.9.0.0

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Data.String

Методы

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

Generic [a] Источник
Подробности экземпляра

Определено в GHC.Internal.Generics

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

type Rep [a]

С версии: base-4.6.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

type Rep [a] = D1 ('MetaData "List" "GHC.Internal.Types" "ghc-internal" 'False) (C1 ('MetaCons "[]" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons ":" ('InfixI 'RightAssociative 5) 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [a])))

Методы

from :: [a] -> Rep [a] x Источник

to :: Rep [a] x -> [a] Источник

IsList [a] Источник

С версии: base-4.7.0.0

Подробности экземпляра

Определено в GHC.Internal.IsList

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

type Item [a]
Подробности экземпляра

Определено в GHC.Internal.IsList

type Item [a] = a

Методы

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

fromListN :: Int -> [Item [a]] -> [a] Источник

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

Read a => Read [a] Источник

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Read

Методы

readsPrec :: Int -> ReadS [a] Источник

readList :: ReadS [[a]] Источник

readPrec :: ReadPrec [a] Источник

readListPrec :: ReadPrec [[a]] Источник

Show a => Show [a] Источник

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Show

Методы

showsPrec :: Int -> [a] -> ShowS Источник

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

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

type Rep1 [] Источник

С версии: base-4.6.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

type Rep1 [] = D1 ('MetaData "List" "GHC.Internal.Types" "ghc-internal" 'False) (C1 ('MetaCons "[]" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons ":" ('InfixI 'RightAssociative 5) 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 [])))
type Rep [a] Источник

С версии: base-4.6.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

type Rep [a] = D1 ('MetaData "List" "GHC.Internal.Types" "ghc-internal" 'False) (C1 ('MetaCons "[]" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons ":" ('InfixI 'RightAssociative 5) 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [a])))
type Item [a] Источник
Подробности экземпляра

Определено в GHC.Internal.IsList

type Item [a] = a

Методы Foldable для списков и вспомогательные функции

foldr :: (a -> b -> b) -> b -> [a] -> b Источник

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

foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...)

foldr' :: (a -> b -> b) -> b -> [a] -> b Источник

foldr' — это вариант foldr, который начинает свёртку списка с последнего элемента и строго вычисляет аккумулятор при раскрутке стека обратно к началу списка. Входной список должен быть конечным, иначе foldr' исчерпает память (зациклится).

Обратите внимание: если функция, объединяющая накопленное значение с каждым элементом, является строгой по аккумулятору, то, за исключением возможного улучшения постоянного множителя, потребление памяти останется таким же, как у foldr, то есть \(\mathcal{O}(n)\).

Если вам нужна строгая правая свёртка с постоянным потреблением памяти, используйте структуру, которая обеспечивает доступ к крайнему правому элементу быстрее, чем за \(\mathcal{O}(n)\), например Seq из пакета containers.

Использование этой функции указывает на то, что структура [] может плохо подходить для данной задачи. Если порядок объединения элементов не имеет значения, используйте вместо неё foldl'.

>>> foldr' (+) [1..4]  -- Use foldl' instead!
10
>>> foldr' (&&) [True, False, True, True] -- Use foldr instead!
False
>>> foldr' (||) [False, False, True, True] -- Use foldr instead!
True

foldr1 :: HasCallStack => (a -> a -> a) -> [a] -> a Источник

foldr1 — это вариант foldr без аргумента начального значения, поэтому его следует применять к непустым спискам. Обратите внимание, что, в отличие от foldr, накопленное значение должно иметь тот же тип, что и элементы списка.

>>> foldr1 (+) [1..4]
10
>>> foldr1 (+) []
*** Exception: Prelude.foldr1: empty list
>>> foldr1 (-) [1..4]
-2
>>> foldr1 (&&) [True, False, True, True]
False
>>> foldr1 (||) [False, False, True, True]
True
>>> force $ foldr1 (+) [1..]
*** Exception: stack overflow

foldl :: forall a b. (b -> a -> b) -> b -> [a] -> b Источник

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

foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn

Список должен быть конечным.

>>> foldl (+) 0 [1..4]
10
>>> foldl (+) 42 []
42
>>> foldl (-) 100 [1..4]
90
>>> foldl (\reversedString nextChar -> nextChar : reversedString) "foo" ['a', 'b', 'c', 'd']
"dcbafoo"
>>> foldl (+) 0 [1..]
* Hangs forever *

foldl' :: forall a b. (b -> a -> b) -> b -> [a] -> b Источник

Строгая версия foldl.

foldl1 :: HasCallStack => (a -> a -> a) -> [a] -> a Источник

foldl1 — это вариант foldl без аргумента начального значения, поэтому его следует применять к непустым спискам. Обратите внимание, что, в отличие от foldl, накопленное значение должно иметь тот же тип, что и элементы списка.

>>> foldl1 (+) [1..4]
10
>>> foldl1 (+) []
*** Exception: Prelude.foldl1: empty list
>>> foldl1 (-) [1..4]
-8
>>> foldl1 (&&) [True, False, True, True]
False
>>> foldl1 (||) [False, False, True, True]
True
>>> foldl1 (+) [1..]
* Hangs forever *

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

\(\mathcal{O}(1)\). Проверяет, пуст ли список.

>>> null []
True
>>> null [1]
False
>>> null [1..]
False

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

\(\mathcal{O}(n)\). length возвращает длину конечного списка в виде Int. Это частный случай более общего genericLength, тип результата которого может быть любым числовым типом.

>>> length []
0
>>> length ['a', 'b', 'c']
3
>>> length [1..]
* Hangs forever *

elem :: Eq a => a -> [a] -> Bool infix 4 Источник

elem — предикат проверки наличия элемента в списке, обычно записываемый в инфиксной форме, например x `elem` xs. Чтобы результат был False, список должен быть конечным; однако True получается, если элемент, равный x, найден по конечному индексу в конечном или бесконечном списке.

Примеры
Развернуть
>>> 3 `elem` []
False
>>> 3 `elem` [1,2]
False
>>> 3 `elem` [1,2,3,4,5]
True
>>> 3 `elem` [1..]
True
>>> 3 `elem` [4..]
* Hangs forever *

notElem :: Eq a => a -> [a] -> Bool infix 4 Источник

notElem является отрицанием elem.

Примеры
Развернуть
>>> 3 `notElem` []
True
>>> 3 `notElem` [1,2]
True
>>> 3 `notElem` [1,2,3,4,5]
False
>>> 3 `notElem` [1..]
False
>>> 3 `notElem` [4..]
* Hangs forever *

maximum :: (Ord a, HasCallStack) => [a] -> a Источник

maximum возвращает наибольшее значение из списка, который должен быть непустым и конечным, а его элементы должны принадлежать упорядоченному типу. Эта функция эквивалентна foldr1 max, а её поведение для списков с несколькими максимальными значениями зависит от соответствующей реализации max. В реализации max по умолчанию порядок элементов списка используется для разрешения равенства: если максимальных значений несколько, выбирается самое правое (это эквивалентно maximumBy compare).

>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum [42]
42
>>> maximum [55, -12, 7, 0, -89]
55
>>> maximum [1..]
* Hangs forever *

minimum :: (Ord a, HasCallStack) => [a] -> a Источник

minimum возвращает наименьшее значение из списка, который должен быть непустым и конечным, а его элементы должны принадлежать упорядоченному типу. Эта функция эквивалентна foldr1 min, а её поведение для списков с несколькими минимальными значениями зависит от соответствующей реализации min. В реализации min по умолчанию порядок элементов списка используется для разрешения равенства: если минимальных значений несколько, выбирается самое левое (это эквивалентно minimumBy compare).

>>> minimum []
*** Exception: Prelude.minimum: empty list
>>> minimum [42]
42
>>> minimum [55, -12, 7, 0, -89]
-89
>>> minimum [1..]
* Hangs forever *

sum :: Num a => [a] -> a Источник

Функция sum вычисляет сумму конечного списка чисел.

>>> sum []
0
>>> sum [42]
42
>>> sum [1..10]
55
>>> sum [4.1, 2.0, 1.7]
7.8
>>> sum [1..]
* Hangs forever *

product :: Num a => [a] -> a Источник

Функция product вычисляет произведение элементов конечного списка чисел.

>>> product []
1
>>> product [42]
42
>>> product [1..10]
3628800
>>> product [4.1, 2.0, 1.7]
13.939999999999998
>>> product [1..]
* Hangs forever *

and :: [Bool] -> Bool Источник

and возвращает конъюнкцию элементов логического списка. Чтобы результат был True, список должен быть конечным; однако False получается, если значение False встречается по конечному индексу в конечном или бесконечном списке.

Примеры
Развернуть
>>> and []
True
>>> and [True]
True
>>> and [False]
False
>>> and [True, True, False]
False
>>> and (False : repeat True) -- Infinite list [False,True,True,True,True,True,True...
False
>>> and (repeat True)
* Hangs forever *

or :: [Bool] -> Bool Источник

or возвращает дизъюнкцию элементов логического списка. Чтобы результат был False, список должен быть конечным; однако True получается, если значение True встречается по конечному индексу в конечном или бесконечном списке.

Примеры
Развернуть
>>> or []
False
>>> or [True]
True
>>> or [False]
False
>>> or [True, True, False]
True
>>> or (True : repeat False) -- Infinite list [True,False,False,False,False,False,False...
True
>>> or (repeat False)
* Hangs forever *

any :: (a -> Bool) -> [a] -> Bool Источник

Для заданных предиката и списка функция any определяет, удовлетворяет ли предикату хотя бы один элемент списка. Чтобы результат был False, список должен быть конечным; однако True получается, если предикат возвращает значение True для элемента с конечным индексом в конечном или бесконечном списке.

Примеры
Развернуть
>>> any (> 3) []
False
>>> any (> 3) [1,2]
False
>>> any (> 3) [1,2,3,4,5]
True
>>> any (> 3) [1..]
True
>>> any (> 3) [0, -1..]
* Hangs forever *

all :: (a -> Bool) -> [a] -> Bool Источник

Для заданных предиката и списка функция all определяет, удовлетворяют ли предикату все элементы списка. Чтобы результат был True, список должен быть конечным; однако False получается, если предикат возвращает значение False для элемента с конечным индексом в конечном или бесконечном списке.

Примеры
Развернуть
>>> all (> 3) []
True
>>> all (> 3) [1,2]
False
>>> all (> 3) [1,2,3,4,5]
False
>>> all (> 3) [1..]
False
>>> all (> 3) [4..]
* Hangs forever *

Другие функции

foldl1' :: HasCallStack => (a -> a -> a) -> [a] -> a Источник

Строгая версия foldl1.

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

Объединяет список списков.

Примеры
Развернуть
>>> concat [[1,2,3], [4,5], [6], []]
[1,2,3,4,5,6]
>>> concat []
[]
>>> concat [[42]]
[42]

concatMap :: (a -> [b]) -> [a] -> [b] Источник

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

concatMap f xs == (concat . map f) xs
Примеры
Развернуть
>>> concatMap (\i -> [-i,i]) []
[]
>>> concatMap (\i -> [-i, i]) [1, 2, 3]
[-1,1,-2,2,-3,3]
>>> concatMap (replicate 3) [0, 2, 4]
[0,0,0,2,2,2,4,4,4]

map :: (a -> b) -> [a] -> [b] Источник

\(\mathcal{O}(n)\). map f xs — это список, полученный применением f к каждому элементу xs, то есть

map f [x1, x2, ..., xn] == [f x1, f x2, ..., f xn]
map f [x1, x2, ...] == [f x1, f x2, ...]

это означает, что map id == id

Примеры
Развернуть
>>> map (+1) [1, 2, 3]
[2,3,4]
>>> map id [1, 2, 3]
[1,2,3]
>>> map (\n -> 3 * n + 1) [1, 2, 3]
[4,7,10]

(++) :: [a] -> [a] -> [a] infixr 5 Источник

(++) соединяет два списка, то есть

[x1, ..., xm] ++ [y1, ..., yn] == [x1, ..., xm, y1, ..., yn]
[x1, ..., xm] ++ [y1, ...] == [x1, ..., xm, y1, ...]

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

Особенности производительности
Развернуть

Время работы этой функции линейно зависит от числа элементов в первом списке. Поэтому повторные применения (++) лучше группировать справа (это поведение используется по умолчанию): xs ++ (ys ++ zs) или просто xs ++ ys ++ zs, но не (xs ++ ys) ++ zs. По той же причине concat = foldr (++) [] работает за линейное время, тогда как foldl (++) [] может привести к квадратичному замедлению.

Примеры
Развернуть
>>> [1, 2, 3] ++ [4, 5, 6]
[1,2,3,4,5,6]
>>> [] ++ [1, 2, 3]
[1,2,3]
>>> [3, 2, 1] ++ []
[3,2,1]

filter :: (a -> Bool) -> [a] -> [a] Источник

\(\mathcal{O}(n)\). filter, применённая к предикату и списку, возвращает список элементов, удовлетворяющих предикату; то есть

filter p xs = [ x | x <- xs, p x]
Примеры
Развернуть
>>> filter odd [1, 2, 3]
[1,3]
>>> filter (\l -> length l > 3) ["Hello", ", ", "World", "!"]
["Hello","World"]
>>> filter (/= 3) [1, 2, 3, 4, 3, 2, 1]
[1,2,4,2,1]

lookup :: Eq a => a -> [(a, b)] -> Maybe b Источник

\(\mathcal{O}(n)\). lookup key assocs выполняет поиск ключа в ассоциативном списке. Чтобы результат был Nothing, список должен быть конечным.

Примеры
Развернуть
>>> lookup 2 []
Nothing
>>> lookup 2 [(1, "first")]
Nothing
>>> lookup 2 [(1, "first"), (2, "second"), (3, "third")]
Just "second"

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

Предупреждение: эта функция частичная и вызывает ошибку для пустых списков. Вместо неё используйте сопоставление с образцом, uncons или listToMaybe. Рассмотрите возможность перехода на Data.List.NonEmpty.

\(\mathcal{O}(1)\). Извлекает первый элемент списка, который должен быть непустым.

Чтобы отключить предупреждение о частичных функциях, добавьте {-# OPTIONS_GHC -Wno-x-partial -Wno-unrecognised-warning-flags #-} в начало файла. Чтобы отключить его во всём пакете, добавьте те же параметры в раздел ghc-options файла Cabal. Чтобы отключить его в GHCi, добавьте :set -Wno-x-partial -Wno-unrecognised-warning-flags в файл конфигурации ~/.ghci. См. также руководство по миграции.

Примеры
Развернуть
>>> head [1, 2, 3]
1
>>> head [1..]
1
>>> head []
*** Exception: Prelude.head: empty list

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

\(\mathcal{O}(n)\). Извлекает последний элемент списка, который должен быть конечным и непустым.

ПРЕДУПРЕЖДЕНИЕ: эта функция частичная. Рассмотрите возможность использования unsnoc.

Примеры
Развернуть
>>> last [1, 2, 3]
3
>>> last [1..]
* Hangs forever *
>>> last []
*** Exception: Prelude.last: empty list

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

Предупреждение: эта функция частичная и вызывает ошибку для пустых списков. Замените её на drop 1 или используйте вместо неё сопоставление с образцом либо uncons. Рассмотрите возможность перехода на Data.List.NonEmpty.

\(\mathcal{O}(1)\). Извлекает элементы списка после его головы; список должен быть непустым.

Чтобы отключить предупреждение о частичных функциях, добавьте {-# OPTIONS_GHC -Wno-x-partial -Wno-unrecognised-warning-flags #-} в начало файла. Чтобы отключить его во всём пакете, добавьте те же параметры в раздел ghc-options файла Cabal. Чтобы отключить его в GHCi, добавьте :set -Wno-x-partial -Wno-unrecognised-warning-flags в файл конфигурации ~/.ghci. См. также руководство по миграции.

Примеры
Развернуть
>>> tail [1, 2, 3]
[2,3]
>>> tail [1]
[]
>>> tail []
*** Exception: Prelude.tail: empty list

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

\(\mathcal{O}(n)\). Возвращает все элементы списка, кроме последнего. Список должен быть непустым.

ПРЕДУПРЕЖДЕНИЕ: эта функция частичная. Рассмотрите возможность использования unsnoc.

Примеры
Развернуть
>>> init [1, 2, 3]
[1,2]
>>> init [1]
[]
>>> init []
*** Exception: Prelude.init: empty list

uncons :: [a] -> Maybe (a, [a]) Источник

\(\mathcal{O}(1)\). Разбивает список на head и tail.

  • Если список пуст, возвращает Nothing.
  • Если список непуст, возвращает Just (x, xs), где x — это head списка, а xs — его tail.
Примеры
Развернуть
>>> uncons []
Nothing
>>> uncons [1]
Just (1,[])
>>> uncons [1, 2, 3]
Just (1,[2,3])

Начиная с: base-4.8.0.0

unsnoc :: [a] -> Maybe ([a], a) Источник

\(\mathcal{O}(n)\). Разбивает список на init и last.

  • Если список пуст, возвращает Nothing.
  • Если список непуст, возвращает Just (xs, x), где xs — это начальнinitая часть списка, а x — его last элемент.

unsnoc является двойственной к uncons: для конечного списка xs

unsnoc xs = (\(hd, tl) -> (reverse tl, hd)) <$> uncons (reverse xs)
Примеры
Развернуть
>>> unsnoc []
Nothing
>>> unsnoc [1]
Just ([],1)
>>> unsnoc [1, 2, 3]
Just ([1,2],3)
Нестрогость
Развернуть
>>> fst <$> unsnoc [undefined]
Just []
>>> head . fst <$> unsnoc (1 : undefined)
Just *** Exception: Prelude.undefined
>>> head . fst <$> unsnoc (1 : 2 : undefined)
Just 1

Начиная с: base-4.19.0.0

(!?) :: [a] -> Int -> Maybe a infixl 9 Источник

Оператор индексации (подстановки) в список, отсчёт начинается с 0. Возвращает Nothing, если индекс выходит за границы списка.

Это тотальная версия частичного оператора !!.

ПРЕДУПРЕЖДЕНИЕ: время работы этой функции линейно зависит от индекса.

Примеры
Развернуть
>>> ['a', 'b', 'c'] !? 0
Just 'a'
>>> ['a', 'b', 'c'] !? 2
Just 'c'
>>> ['a', 'b', 'c'] !? 3
Nothing
>>> ['a', 'b', 'c'] !? (-1)
Nothing

Начиная с: base-4.19.0.0

(!!) :: HasCallStack => [a] -> Int -> a infixl 9 Источник

Оператор индексации (подстановки) в список, отсчёт начинается с 0. Это частный случай более общего genericIndex, который принимает индекс любого целочисленного типа.

ПРЕДУПРЕЖДЕНИЕ: эта функция частичная, и её следует использовать только в том случае, если вы уверены, что индексация не завершится ошибкой. В противном случае используйте !?.

ПРЕДУПРЕЖДЕНИЕ: время работы этой функции линейно зависит от индекса.

Примеры
Развернуть
>>> ['a', 'b', 'c'] !! 0
'a'
>>> ['a', 'b', 'c'] !! 2
'c'
>>> ['a', 'b', 'c'] !! 3
*** Exception: Prelude.!!: index too large
>>> ['a', 'b', 'c'] !! (-1)
*** Exception: Prelude.!!: negative index

scanl :: (b -> a -> b) -> b -> [a] -> [b] Исходный код

\(\mathcal{O}(n)\). 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
Примеры
Развернуть
>>> scanl (+) 0 [1..4]
[0,1,3,6,10]
>>> scanl (+) 42 []
[42]
>>> scanl (-) 100 [1..4]
[100,99,97,94,90]
>>> scanl (\reversedString nextChar -> nextChar : reversedString) "foo" ['a', 'b', 'c', 'd']
["foo","afoo","bafoo","cbafoo","dcbafoo"]
>>> take 10 (scanl (+) 0 [1..])
[0,1,3,6,10,15,21,28,36,45]
>>> take 1 (scanl undefined 'a' undefined)
"a"

scanl1 :: (a -> a -> a) -> [a] -> [a] Исходный код

\(\mathcal{O}(n)\). scanl1 — это вариант scanl без аргумента начального значения:

scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]
Примеры
Развернуть
>>> scanl1 (+) [1..4]
[1,3,6,10]
>>> scanl1 (+) []
[]
>>> scanl1 (-) [1..4]
[1,-1,-4,-8]
>>> scanl1 (&&) [True, False, True, True]
[True,False,False,False]
>>> scanl1 (||) [False, False, True, True]
[False,False,True,True]
>>> take 10 (scanl1 (+) [1..])
[1,3,6,10,15,21,28,36,45,55]
>>> take 1 (scanl1 undefined ('a' : undefined))
"a"

scanl' :: (b -> a -> b) -> b -> [a] -> [b] Исходный код

\(\mathcal{O}(n)\). Строгая версия scanl.

scanr :: (a -> b -> b) -> b -> [a] -> [b] Исходный код

\(\mathcal{O}(n)\). scanr — двойственная scanl функция, выполняющая вычисления справа налево. Обратите внимание, что порядок параметров накапливающей функции обратен порядку в scanl. Также обратите внимание, что

head (scanr f z xs) == foldr f z xs.
Примеры
Развернуть
>>> scanr (+) 0 [1..4]
[10,9,7,4,0]
>>> scanr (+) 42 []
[42]
>>> scanr (-) 100 [1..4]
[98,-97,99,-96,100]
>>> scanr (\nextChar reversedString -> nextChar : reversedString) "foo" ['a', 'b', 'c', 'd']
["abcdfoo","bcdfoo","cdfoo","dfoo","foo"]
>>> force $ scanr (+) 0 [1..]
*** Exception: stack overflow

scanr1 :: (a -> a -> a) -> [a] -> [a] Исходный код

\(\mathcal{O}(n)\). scanr1 — это вариант scanr без аргумента начального значения.

Примеры
Развернуть
>>> scanr1 (+) [1..4]
[10,9,7,4]
>>> scanr1 (+) []
[]
>>> scanr1 (-) [1..4]
[-2,3,-1,4]
>>> scanr1 (&&) [True, False, True, True]
[False,False,True,True]
>>> scanr1 (||) [True, True, False, False]
[True,True,False,False]
>>> force $ scanr1 (+) [1..]
*** Exception: stack overflow

iterate :: (a -> a) -> a -> [a] Исходный код

iterate f x возвращает бесконечный список последовательных результатов применения f к x:

iterate f x == [x, f x, f (f x), ...]
Ленивость
Развернуть

Обратите внимание, что iterate является ленивой, что потенциально может привести к накоплению thunk'ов, если потребитель не вычисляет каждый следующий элемент. Строгую версию этой функции см. в iterate'.

>>> take 1 $ iterate undefined 42
[42]
Примеры
Развернуть
>>> take 10 $ iterate not True
[True,False,True,False,True,False,True,False,True,False]
>>> take 10 $ iterate (+3) 42
[42,45,48,51,54,57,60,63,66,69]

iterate id == repeat:

>>> take 10 $ iterate id 1
[1,1,1,1,1,1,1,1,1,1]

iterate' :: (a -> a) -> a -> [a] Исходный код

iterate' — строгая версия iterate.

Перед продолжением она вычисляет результат каждого применения функции до слабой головной нормальной формы (WHNF).

>>> take 1 $ iterate' undefined 42
*** Exception: Prelude.undefined

repeat :: a -> [a] Исходный код

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

Примеры
Развернуть
>>> take 10 $ repeat 17
[17,17,17,17,17,17,17,17,17, 17]
>>> repeat undefined
[*** Exception: Prelude.undefined

replicate :: Int -> a -> [a] Исходный код

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

Примеры
Развернуть
>>> replicate 0 True
[]
>>> replicate (-1) True
[]
>>> replicate 4 True
[True,True,True,True]

cycle :: HasCallStack => [a] -> [a] Исходный код

cycle зацикливает конечный список или, что эквивалентно, бесконечно повторяет исходный список. Для бесконечных списков функция возвращает исходный список без изменений.

Примеры
Развернуть
>>> cycle []
*** Exception: Prelude.cycle: empty list
>>> take 10 (cycle [42])
[42,42,42,42,42,42,42,42,42,42]
>>> take 10 (cycle [2, 5, 7])
[2,5,7,2,5,7,2,5,7,2]
>>> take 1 (cycle (42 : undefined))
[42]

take :: Int -> [a] -> [a] Исходный код

take n, применённая к списку xs, возвращает префикс xs длины n или сам xs, если n >= length xs.

Это частный случай более общей функции genericTake, в которой n может иметь любой целочисленный тип.

Ленивость
Развернуть
>>> take 0 undefined
[]
>>> take 2 (1 : 2 : undefined)
[1,2]
Примеры
Развернуть
>>> 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]
[]

drop :: Int -> [a] -> [a] Исходный код

drop n xs возвращает суффикс xs после первых n элементов или [], если n >= length xs.

Это частный случай более общей функции genericDrop, в которой n может иметь любой целочисленный тип.

Примеры
Развернуть
>>> 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]

splitAt :: Int -> [a] -> ([a], [a]) Исходный код

splitAt n xs возвращает кортеж, в котором первый элемент — префикс xs длины n, а второй элемент — остаток списка:

splitAt — частный случай более общей функции genericSplitAt, в которой n может иметь любой целочисленный тип.

Ленивость
Развернуть

Это эквивалентно (take n xs, drop n xs), если только n не равно _|_: splitAt _|_ xs = _|_, а не (_|_, _|_)).

Первый компонент кортежа создаётся лениво:

>>> fst (splitAt 0 undefined)
[]
>>> take 1 (fst (splitAt 10 (1 : undefined)))
[1]
Примеры
Развернуть
>>> 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])

takeWhile :: (a -> Bool) -> [a] -> [a] Исходный код

takeWhile, применённая к предикату p и списку xs, возвращает самый длинный (возможно, пустой) префикс xs, элементы которого удовлетворяют p.

Ленивость
Развернуть
>>> takeWhile (const False) undefined
*** Exception: Prelude.undefined
>>> takeWhile (const False) (undefined : undefined)
[]
>>> take 1 (takeWhile (const True) (1 : undefined))
[1]
Примеры
Развернуть
>>> 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] Исходный код

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]) Исходный код

span, применённая к предикату p и списку xs, возвращает кортеж, в котором первый элемент — самый длинный (возможно, пустой) префикс xs, элементы которого удовлетворяют p, а второй элемент — остаток списка:

span p xs эквивалентно (takeWhile p xs, dropWhile p xs), даже если p равно _|_.

Ленивость
Развернуть
>>> span undefined []
([],[])
>>> fst (span (const False) undefined)
*** Exception: Prelude.undefined
>>> fst (span (const False) (undefined : undefined))
[]
>>> take 1 (fst (span (const True) (1 : undefined)))
[1]

span лениво создаёт первый компонент кортежа:

>>> take 10 (fst (span (const True) [1..]))
[1,2,3,4,5,6,7,8,9,10]
Примеры
Развернуть
>>> 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])

break :: (a -> Bool) -> [a] -> ([a], [a]) Исходный код

break, применённая к предикату p и списку xs, возвращает кортеж, в котором первый элемент — самый длинный (возможно, пустой) префикс xs, элементы которого не удовлетворяют p, а второй элемент — остаток списка:

break p эквивалентно span (not . p) и, следовательно, (takeWhile (not . p) xs, dropWhile (not . p) xs), даже если p равно _|_.

Ленивость
Развернуть
>>> break undefined []
([],[])
>>> fst (break (const True) undefined)
*** Exception: Prelude.undefined
>>> fst (break (const True) (undefined : undefined))
[]
>>> take 1 (fst (break (const False) (1 : undefined)))
[1]

break лениво создаёт первый компонент кортежа:

>>> take 10 (fst (break (const False) [1..]))
[1,2,3,4,5,6,7,8,9,10]
Примеры
Развернуть
>>> 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],[])

reverse :: [a] -> [a] Исходный код

\(\mathcal{O}(n)\). reverse xs возвращает элементы xs в обратном порядке. xs должен быть конечным.

Ленивость
Развернуть

reverse является ленивой по отношению к элементам.

>>> head (reverse [undefined, 1])
1
>>> reverse (1 : 2 : undefined)
*** Exception: Prelude.undefined
Примеры
Развернуть
>>> reverse []
[]
>>> reverse [42]
[42]
>>> reverse [2,5,7]
[7,5,2]
>>> reverse [1..]
* Hangs forever *

zip :: [a] -> [b] -> [(a, b)] Исходный код

\(\mathcal{O}(\min(m,n))\). zip принимает два списка и возвращает список соответствующих пар.

zip лениво обрабатывает правый аргумент:

>>> zip [] undefined
[]
>>> zip undefined []
*** Exception: Prelude.undefined
...

zip поддерживает слияние списков, но эта возможность ограничена первым аргументом-списком и результирующим списком.

Примеры
Развернуть
>>> zip [1, 2, 3] ['a', 'b', 'c']
[(1,'a'),(2,'b'),(3,'c')]

Если один входной список короче другого, лишние элементы более длинного списка отбрасываются, даже если один из списков бесконечен:

>>> zip [1] ['a', 'b']
[(1,'a')]
>>> zip [1, 2] ['a']
[(1,'a')]
>>> zip [] [1..]
[]
>>> zip [1..] []
[]

zip3 :: [a] -> [b] -> [c] -> [(a, b, c)] Исходный код

zip3 принимает три списка и возвращает список троек, аналогично zip. Поддерживает слияние списков, но эта возможность ограничена первым аргументом-списком и результирующим списком.

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Исходный код

\(\mathcal{O}(\min(m,n))\). zipWith обобщает zip: вместо функции построения кортежей она объединяет элементы с помощью функции, переданной первым аргументом.

zipWith (,) xs ys == zip xs ys
zipWith f [x1,x2,x3..] [y1,y2,y3..] == [f x1 y1, f x2 y2, f x3 y3..]

zipWith лениво обрабатывает правый аргумент:

>>> let f = undefined
>>> zipWith f [] undefined
[]

zipWith поддерживает слияние списков, но эта возможность ограничена первым аргументом-списком и результирующим списком.

Примеры
Развернуть

zipWith (+) можно применить к двум спискам, чтобы получить список соответствующих сумм:

>>> zipWith (+) [1, 2, 3] [4, 5, 6]
[5,7,9]
>>> zipWith (++) ["hello ", "foo"] ["world!", "bar"]
["hello world!","foobar"]

zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] Исходный код

\(\mathcal{O}(\min(l,m,n))\). Функция zipWith3 принимает функцию, объединяющую три элемента, а также три списка и возвращает список результатов применения функции к соответствующим элементам, аналогично zipWith. Поддерживает слияние списков, но эта возможность ограничена первым аргументом-списком и результирующим списком.

zipWith3 (,,) xs ys zs == zip3 xs ys zs
zipWith3 f [x1,x2,x3..] [y1,y2,y3..] [z1,z2,z3..] == [f x1 y1 z1, f x2 y2 z2, f x3 y3 z3..]
Примеры
Развернуть
>>> zipWith3 (\x y z -> [x, y, z]) "123" "abc" "xyz"
["1ax","2by","3cz"]
>>> zipWith3 (\x y z -> (x * y) + z) [1, 2, 3] [4, 5, 6] [7, 8, 9]
[11,18,27]

unzip :: [(a, b)] -> ([a], [b]) Исходный код

unzip преобразует список пар в список первых компонентов и список вторых компонентов.

Примеры
Развернуть
>>> unzip []
([],[])
>>> unzip [(1, 'a'), (2, 'b')]
([1,2],"ab")

unzip3 :: [(a, b, c)] -> ([a], [b], [c]) Исходный код

Функция unzip3 принимает список троек и возвращает три списка соответствующих компонентов, аналогично unzip.

Примеры
Развернуть
>>> unzip3 []
([],[],[])
>>> unzip3 [(1, 'a', True), (2, 'b', False)]
([1,2],"ab",[True,False])

errorEmptyList :: HasCallStack => String -> a Исходный код

Слияние списков в GHC

augment :: (forall b. (a -> b -> b) -> b -> b) -> [a] -> [a] Исходный код

Производитель списка, который можно объединить с foldr. Эта функция представляет собой лишь

   augment g xs = g (:) xs

однако упрощатель GHC преобразует выражение вида foldr k z (augment g xs), которое может возникнуть после встраивания, в g k (foldr k z xs), избегая создания промежуточного списка.

build :: (forall b. (a -> b -> b) -> b -> b) -> [a] Исходный код

Производитель списка, который можно объединить с foldr. Эта функция представляет собой лишь

   build g = g (:) []

однако упрощатель GHC преобразует выражение вида foldr k z (build g), которое может возникнуть после встраивания, в g k z, избегая создания промежуточного списка.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/GHC-List.html

Spec-Zone.ru

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