Spec-Zone.ru › Haskell 9

GHC.Список

Авторские права (c) Университет Глазго 1994-2002
Лицензия см. libraries/base/LICENSE
Поддержка ghc-devs@haskell.org
Устойчивость внутренняя
Переносимость непереносимая (Расширения GHC)
Безопасный Haskell Безопасный
Язык Haskell2010

Содержание

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

Описание

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

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

data Список 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-prim-0.10.0

Примеры использования
Подробности примеров
Eq1 [] Source

Since: base-4.9.0.0

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

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

Методы

liftEq :: (a -> b -> Bool) -> [a] -> [b] -> Bool Source

Ord1 [] Source

Since: base-4.9.0.0

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

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

Методы

liftCompare :: (a -> b -> Ordering) -> [a] -> [b] -> Ordering Source

Read1 [] Source

Since: base-4.9.0.0

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

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

Методы

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS [a] Source

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [[a]] Source

liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [a] Source

liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [[a]] Source

Show1 [] Source

Since: base-4.9.0.0

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

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

Методы

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> [a] -> ShowS Source

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [[a]] -> ShowS Source

Alternative [] Source

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

Since: base-2.1

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

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

Методы

empty :: [a] Source

(<|>) :: [a] -> [a] -> [a] Source

some :: [a] -> [[a]] Source

many :: [a] -> [[a]] Source

Applicative [] Source

Since: base-2.1

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

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

Методы

pure :: a -> [a] Source

(<*>) :: [a -> b] -> [a] -> [b] Source

liftA2 :: (a -> b -> c) -> [a] -> [b] -> [c] Source

(*>) :: [a] -> [b] -> [b] Source

(<*) :: [a] -> [b] -> [a] Source

Functor [] Source

Since: base-2.1

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

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

Методы

fmap :: (a -> b) -> [a] -> [b] Source

(<$) :: a -> [b] -> [a] Source

Monad [] Source

Since: 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 :: 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 [] Source

Since: base-2.1

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

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

Методы

traverse :: Applicative f => (a -> f b) -> [a] -> f [b] Source

sequenceA :: Applicative f => [f a] -> f [a] Source

mapM :: Monad m => (a -> m b) -> [a] -> m [b] Source

sequence :: Monad m => [m a] -> m [a] Source

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

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

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

type Rep1 []

Since: base-4.6.0.0

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

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

type Rep1 [] = D1 ('MetaData "List" "GHC.Types" "ghc-prim" '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 Source

to1 :: Rep1 [] a -> [a] Source

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

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

Методы

lift :: Quote m => [a] -> m Exp Source

liftTyped :: forall (m :: Type -> Type). Quote m => [a] -> Code m [a] Source

IsChar c => PrintfArg [c] Source

Since: base-2.1

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

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

Методы

formatArg :: [c] -> FieldFormatter Source

parseFormat :: [c] -> ModifierParser Source

IsChar c => PrintfType [c] Source

Since: base-2.1

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

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

Методы

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

Monoid [a] Source

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

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.Types" "ghc-prim" '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 Исходный код

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

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

Методы

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

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

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

Определено в GHC.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] Исходный код

type Rep1 [] Исходный код

С момента: base-4.6.0.0

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

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

type Rep1 [] = D1 ('MetaData "List" "GHC.Types" "ghc-prim" '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.Types" "ghc-prim" '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

Методы List-мономорфного 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' исчерпает память (расходится).

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

Если вам нужен строгий правый сгиб с постоянной памятью, вам нужна структура, которая поддерживает доступ к правому элементу быстрее, чем \(\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 Source

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 Source

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

foldl1 :: HasCallStack => (a -> a -> a) -> [a] -> a Source

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 Source

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

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

length :: [a] -> Int Source

\(\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 Source

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 Source

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 Source

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 Source

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 Source

Функция 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 Source

Функция 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 Source

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 Source

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 Source

Применяемая к предикату и списку, 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 Source

Применяемая к предикату и списку, 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 Source

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

concat :: [[a]] -> [a] Source

Конкатенация списка списков.

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

concatMap :: (a -> [b]) -> [a] -> [b] Source

Карта функции, возвращающей список, над списком, и конкатенация результатов. 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] Source

\(\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 Source

(++) конкатенирует два списка, т.е.,

[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] Source

\(\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 Source

\(\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 Source

Предупреждение: Это частичная функция, она генерирует ошибку при пустых списках. Используйте обращение к шаблонам, 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 Source

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

ВНИМАНИЕ: Эта функция частичная. Рассмотрите использование unsnoc вместо этого.

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

tail :: HasCallStack => [a] -> [a] Source

Предупреждение: Это частичная функция, она генерирует ошибку при пустых списках. Замените на 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] Source

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

ВНИМАНИЕ: Эта функция частичная. Рассмотрите использование unsnoc вместо этого.

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

uncons :: [a] -> Maybe (a, [a]) Source

\(\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])

Since: base-4.8.0.0

unsnoc :: [a] -> Maybe ([a], a) Source

\(\mathcal{O}(n)\). Разложить список на init и last.

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

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

Since: base-4.19.0.0

(!?) :: [a] -> Int -> Maybe a infixl 9 Source

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

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

ВНИМАНИЕ: Эта функция требует линейного времени относительно индекса.

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

(!!) :: HasCallStack => [a] -> Int -> a infixl 9 Source

Оператор индекса списка (подстрочный индекс), начиная с 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] Source

\(\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] Source

\(\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] Source

\(\mathcal{O}(n)\). Жесткая версия функции scanl.

scanr :: (a -> b -> b) -> b -> [a] -> [b] Source

\(\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] Source

\(\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] Source

Функция iterate f x возвращает бесконечный список, получаемый путем многократного применения функции f к значению x:

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

Обратите внимание, что функция iterate ленивая, что может привести к накоплению задержек, если потребитель не принуждает каждое итерационное значение. См. 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] Source

Функция iterate' — это строгая версия функции iterate.

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

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

repeat :: a -> [a] Source

Функция 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] Source

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

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

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

Функция 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] Source

Функция 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] Source

Функция 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]
END_OF_DOCUMENT_MARKER

splitAt :: Int -> [a] -> ([a], [a]) Source

splitAt n 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] Source

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] 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 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]) Source

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] Source

\(\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)] Source

\(\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)] Source

zip3 берёт три списка и возвращает список троек, аналогично zip. Она способна к слиянию списков, но ограничена своим первым списком-аргументом и результатом.

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] Source

\(\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] Source

\(\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]) Source

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

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

unzip3 :: [(a, b, c)] -> ([a], [b], [c]) Source

Функция 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.12.1/docs/libraries/base-4.21.0.0-8e62/GHC-List.html

Spec-Zone.ru

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