Data.Bifoldable
| Авторские права | (C) 2011-2016 Edward Kmett |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE) |
| Поддерживающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Описание
С тех пор: base-4.10.0.0
class Bifoldable (p :: Type -> Type -> Type) where Исходный код
Bifoldable определяет структуры, допускающие свертывание с двумя различными типами элементов (в отличие от Foldable, у которой один тип элементов). Распространённые примеры — Either и (,):
instance Bifoldable Either where bifoldMap f _ (Left a) = f a bifoldMap _ g (Right b) = g b instance Bifoldable (,) where bifoldr f g z (a, b) = f a (g b z)
В некоторых примерах ниже также используется BiList для демонстрации поведения пустых Bifoldable, когда это уместно (Either и (,) содержат всегда соответственно ровно 1 и 2 элемента):
data BiList a b = BiList [a] [b] instance Bifoldable BiList where bifoldr f g z (BiList as bs) = foldr f (foldr g z bs) as
Минимальное Bifoldable определение состоит либо из bifoldMap или bifoldr. При определении большего набора необходимо убедиться, что выполняются следующие тождества:
bifold ≡ bifoldMap id id bifoldMap f g ≡ bifoldr (mappend . f) (mappend . g) mempty bifoldr f g z t ≡ appEndo (bifoldMap (Endo . f) (Endo . g) t) z
Если тип также является экземпляром Foldable, то он должен удовлетворять (с учётом лени):
bifoldl const ≡ foldl bifoldr (flip const) ≡ foldr bifoldMap (const mempty) ≡ foldMap
Если тип также является экземпляром Bifunctor , он должен удовлетворять:
bifoldMap f g ≡ bifold . bimap f g
что подразумевает
bifoldMap f g . bimap h i ≡ bifoldMap (f . h) (g . i)
С тех пор: base-4.10.0.0
Методы
bifold :: Monoid m => p m m -> m Исходный код
Объединяет элементы структуры, используя моноид.
bifold ≡ bifoldMap id id
Примеры
Базовое использование:
>>> bifold (Right [1, 2, 3]) [1,2,3]
>>> bifold (Left [5, 6]) [5,6]
>>> bifold ([1, 2, 3], [4, 5]) [1,2,3,4,5]
>>> bifold (Product 6, Product 7)
Product {getProduct = 42}
>>> bifold (Sum 6, Sum 7)
Sum {getSum = 13}
С тех пор: base-4.10.0.0
bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> p a b -> m Исходный код
Объединяет элементы структуры, задав способы их отображения в общий моноид.
bifoldMap f g ≡ bifoldr (mappend . f) (mappend . g) mempty
Примеры
Базовое использование:
>>> bifoldMap (take 3) (fmap digitToInt) ([1..], "89") [1,2,3,8,9]
>>> bifoldMap (take 3) (fmap digitToInt) (Left [1..]) [1,2,3]
>>> bifoldMap (take 3) (fmap digitToInt) (Right "89") [8,9]
С тех пор: base-4.10.0.0
bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> p a b -> c Исходный код
Объединяет элементы структуры в правоассоциативном порядке. Учитывая гипотетическую функцию toEitherList :: p a b -> [Either a b] , возвращающую список всех элементов структуры в порядке, выполнялось бы следующее:
bifoldr f g z ≡ foldr (either f g) z . toEitherList
Примеры
Базовое использование:
> bifoldr (+) (*) 3 (5, 7) 26 -- 5 + (7 * 3) > bifoldr (+) (*) 3 (7, 5) 22 -- 7 + (5 * 3) > bifoldr (+) (*) 3 (Right 5) 15 -- 5 * 3 > bifoldr (+) (*) 3 (Left 5) 8 -- 5 + 3
С тех пор: base-4.10.0.0
bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> p a b -> c Исходный код
Объединяет элементы структуры в левоассоциативном порядке. Учитывая гипотетическую функцию toEitherList :: p a b -> [Either a b] , возвращающую список всех элементов структуры в порядке, выполнялось бы следующее:
bifoldl f g z ≡ foldl (acc -> either (f acc) (g acc)) z . toEitherList
Обратите внимание, что если вам нужен эффективный левый fold, вы, вероятно, захотите использовать bifoldl' вместо bifoldl. Причина в том, что последняя не форсирует «внутренние» результаты, что приводит к цепочке ленивых вычислений, которые затем должны быть вычислены снаружи вовнутрь.
Примеры
Базовое использование:
> bifoldl (+) (*) 3 (5, 7) 56 -- (5 + 3) * 7 > bifoldl (+) (*) 3 (7, 5) 50 -- (7 + 3) * 5 > bifoldl (+) (*) 3 (Right 5) 15 -- 5 * 3 > bifoldl (+) (*) 3 (Left 5) 8 -- 5 + 3
С тех пор: base-4.10.0.0
Экземпляры
| Bifoldable Arg Источник | С версии: base-4.10.0.0 |
| Bifoldable Either Источник | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable | |
| Bifoldable (,) Источник |
Законы класса для кортежей выполняются только с учетом ленивости. Методы Bifoldable более ленивы, чем их аналоги в Foldable. Например, закон >>> bifoldr (flip const) (:) [] (undefined :: (Int, Word)) `seq` () () >>> foldr (:) [] (errorWithoutStackTrace "error!" :: (Int, Word)) `seq` () *** Exception: error! С версии: base-4.10.0.0 |
| Bifoldable (Const :: Type -> Type -> Type) Источник | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable | |
| Bifoldable ((,,) x) Источник | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable | |
| Bifoldable (K1 i :: Type -> Type -> Type) Источник | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable | |
| Bifoldable ((,,,) x y) Source | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable | |
| Bifoldable ((,,,,) x y z) Source | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable Краткое описание методовbifold :: Monoid m => (x, y, z, m, m) -> m Source bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> (x, y, z, a, b) -> m Source bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> (x, y, z, a, b) -> c Source bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> (x, y, z, a, b) -> c Source | |
| Bifoldable ((,,,,,) x y z w) Source | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable Краткое описание методовbifold :: Monoid m => (x, y, z, w, m, m) -> m Source bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> (x, y, z, w, a, b) -> m Source bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> (x, y, z, w, a, b) -> c Source bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> (x, y, z, w, a, b) -> c Source | |
| Bifoldable ((,,,,,,) x y z w v) Source | С версии: base-4.10.0.0 |
Определено в Data.Bifoldable Краткое описание методовbifold :: Monoid m => (x, y, z, w, v, m, m) -> m Source bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> (x, y, z, w, v, a, b) -> m Source bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> (x, y, z, w, v, a, b) -> c Source bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> (x, y, z, w, v, a, b) -> c Source | |
bifoldr' :: Bifoldable t => (a -> c -> c) -> (b -> c -> c) -> c -> t a b -> c Source
Как bifoldr, но строгое в результате функций редукции на каждом шаге.
С версии: base-4.10.0.0
bifoldr1 :: Bifoldable t => (a -> a -> a) -> t a a -> a Source
Вариант bifoldr без базового случая, и поэтому может применяться только к непустым структурам.
Примеры
Базовое использование:
>>> bifoldr1 (+) (5, 7) 12
>>> bifoldr1 (+) (Right 7) 7
>>> bifoldr1 (+) (Left 5) 5
> bifoldr1 (+) (BiList [1, 2] [3, 4]) 10 -- 1 + (2 + (3 + 4))
>>> bifoldr1 (+) (BiList [1, 2] []) 3
На пустых структурах эта функция вызывает исключение:
>>> bifoldr1 (+) (BiList [] []) *** Exception: bifoldr1: empty structure ...
С версии: base-4.10.0.0
bifoldrM :: (Bifoldable t, Monad m) => (a -> c -> m c) -> (b -> c -> m c) -> c -> t a b -> m c Source
Правая ассоциативная монадическая бискладка над структурой.
С версии: base-4.10.0.0
bifoldl' :: Bifoldable t => (a -> b -> a) -> (a -> c -> a) -> a -> t b c -> a Source
Как bifoldl, но строго в результате функций сокращения на каждом шаге.
Это гарантирует, что каждый шаг bifold принуждается к слабой нормальной форме перед применением, избегая сбора заглушек, которые в противном случае произошли бы. Это часто то, что вам нужно, чтобы строго свести конечную структуру к одному, монолитный результату (например, bilength).
С тех пор: base-4.10.0.0
bifoldl1 :: Bifoldable t => (a -> a -> a) -> t a a -> a Source
Вариант bifoldl, который не имеет базового случая и, следовательно, может быть применен только к непустым структурам.
Примеры
Базовое использование:
>>> bifoldl1 (+) (5, 7) 12
>>> bifoldl1 (+) (Right 7) 7
>>> bifoldl1 (+) (Left 5) 5
> bifoldl1 (+) (BiList [1, 2] [3, 4]) 10 -- ((1 + 2) + 3) + 4
>>> bifoldl1 (+) (BiList [1, 2] []) 3
В пустых структурах эта функция выбрасывает исключение:
>>> bifoldl1 (+) (BiList [] []) *** Exception: bifoldl1: empty structure ...
С тех пор: base-4.10.0.0
bifoldlM :: (Bifoldable t, Monad m) => (a -> b -> m a) -> (a -> c -> m a) -> a -> t b c -> m a Source
Левоассоциативное монадическое bifold над структурой.
Примеры
Базовое использование:
>>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 ("Hello", True)
"Hello"
"True"
42
>>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Right True) "True" 42
>>> bifoldlM (\a b -> print b >> pure a) (\a c -> print (show c) >> pure a) 42 (Left "Hello") "Hello" 42
С тех пор: base-4.10.0.0
bitraverse_ :: (Bifoldable t, Applicative f) => (a -> f c) -> (b -> f d) -> t a b -> f () Source
Преобразуйте каждый элемент структуры, используя одно из двух действий, вычислите эти действия слева направо и проигнорируйте результаты. Для версии, которая не игнорирует результаты, см. bitraverse.
Примеры
Базовое использование:
>>> bitraverse_ print (print . show) ("Hello", True)
"Hello"
"True"
>>> bitraverse_ print (print . show) (Right True) "True"
>>> bitraverse_ print (print . show) (Left "Hello") "Hello"
С тех пор: base-4.10.0.0
bifor_ :: (Bifoldable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f () Source
Как bitraverse_, но со структурой в качестве основного аргумента. Для версии, которая не игнорирует результаты, см. bifor.
Примеры
Базовое использование:
>>> bifor_ ("Hello", True) print (print . show)
"Hello"
"True"
>>> bifor_ (Right True) print (print . show) "True"
>>> bifor_ (Left "Hello") print (print . show) "Hello"
С тех пор: base-4.10.0.0
bimapM_ :: (Bifoldable t, Applicative f) => (a -> f c) -> (b -> f d) -> t a b -> f () Source
Псевдоним для bitraverse_.
С тех пор: base-4.10.0.0
biforM_ :: (Bifoldable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f () Source
Псевдоним для bifor_.
С тех пор: base-4.10.0.0
bimsum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a Source
Псевдоним для biasum.
С тех пор: base-4.10.0.0
bisequenceA_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f () Source
Псевдоним для bisequence_.
С тех пор: base-4.10.0.0
bisequence_ :: (Bifoldable t, Applicative f) => t (f a) (f b) -> f () Source
Вычислите каждое действие в структуре слева направо и проигнорируйте результаты. Для версии, которая не игнорирует результаты, см. bisequence.
Примеры
Базовое использование:
>>> bisequence_ (print "Hello", print "World") "Hello" "World"
>>> bisequence_ (Left (print "Hello")) "Hello"
>>> bisequence_ (Right (print "World")) "World"
С тех пор: base-4.10.0.0
biasum :: (Bifoldable t, Alternative f) => t (f a) (f a) -> f a Source
Сумма набора действий, обобщая biconcat.
Примеры
Базовое использование:
>>> biasum (Nothing, Nothing) Nothing
>>> biasum (Nothing, Just 42) Just 42
>>> biasum (Just 18, Nothing) Just 18
>>> biasum (Just 18, Just 42) Just 18
С тех пор: base-4.10.0.0
biList :: Bifoldable t => t a a -> [a] Source
Собирает список элементов структуры слева направо.
Примеры
Базовое использование:
>>> biList (18, 42) [18,42]
>>> biList (Left 18) [18]
С тех пор: base-4.10.0.0
binull :: Bifoldable t => t a b -> Bool Source
Проверка, является ли структура пустой.
Примеры
Базовое использование:
>>> binull (18, 42) False
>>> binull (Right 42) False
>>> binull (BiList [] []) True
С тех пор: base-4.10.0.0
bilength :: Bifoldable t => t a b -> Int Source
Возвращает размер/длину конечной структуры как Int.
Примеры
Базовое использование:
>>> bilength (True, 42) 2
>>> bilength (Right 42) 1
>>> bilength (BiList [1,2,3] [4,5]) 5
>>> bilength (BiList [] []) 0
В бесконечных структурах эта функция зависает:
> bilength (BiList [1..] []) * Hangs forever *
С тех пор: base-4.10.0.0
bielem :: (Bifoldable t, Eq a) => a -> t a a -> Bool Source
Является ли элемент в структуре?
Примеры
Базовое использование:
>>> bielem 42 (17, 42) True
>>> bielem 42 (17, 43) False
>>> bielem 42 (Left 42) True
>>> bielem 42 (Right 13) False
>>> bielem 42 (BiList [1..5] [1..100]) True
>>> bielem 42 (BiList [1..5] [1..41]) False
С тех пор: base-4.10.0.0
bimaximum :: (Bifoldable t, Ord a) => t a a -> a Source
Наибольший элемент непустой структуры. Эта функция эквивалентна bifoldr1 max, а её поведение на структурах с несколькими наибольшими элементами зависит от соответствующей реализации max. Для стандартной реализации max (max x y = if x <= y then y else x) порядок структуры используется как решающий фактор при ничьих: если есть несколько наибольших элементов, выбирается самый правый из них (это эквивалентно bimaximumBy
compare).
Примеры
Базовое использование:
>>> bimaximum (42, 17) 42
>>> bimaximum (Right 42) 42
>>> bimaximum (BiList [13, 29, 4] [18, 1, 7]) 29
>>> bimaximum (BiList [13, 29, 4] []) 29
На пустых структурах эта функция генерирует исключение:
>>> bimaximum (BiList [] []) *** Exception: bimaximum: empty structure ...
С версии: base-4.10.0.0
biminimum :: (Bifoldable t, Ord a) => t a a -> a Source
Наименьший элемент непустой структуры. Эта функция эквивалентна bifoldr1 min, а её поведение на структурах с несколькими наименьшими элементами зависит от соответствующей реализации min. Для стандартной реализации min (min x y = if x <= y then x else y) порядок структуры используется как решающий фактор при ничьих: если есть несколько наименьших элементов, выбирается самый левый из них (это эквивалентно biminimumBy
compare).
Примеры
Базовое использование:
>>> biminimum (42, 17) 17
>>> biminimum (Right 42) 42
>>> biminimum (BiList [13, 29, 4] [18, 1, 7]) 1
>>> biminimum (BiList [13, 29, 4] []) 4
На пустых структурах эта функция генерирует исключение:
>>> biminimum (BiList [] []) *** Exception: biminimum: empty structure ...
С версии: base-4.10.0.0
bisum :: (Bifoldable t, Num a) => t a a -> a Source
Функция bisum вычисляет сумму чисел в структуре.
Примеры
Базовое использование:
>>> bisum (42, 17) 59
>>> bisum (Right 42) 42
>>> bisum (BiList [13, 29, 4] [18, 1, 7]) 72
>>> bisum (BiList [13, 29, 4] []) 46
>>> bisum (BiList [] []) 0
С версии: base-4.10.0.0
biproduct :: (Bifoldable t, Num a) => t a a -> a Source
Функция biproduct вычисляет произведение чисел в структуре.
Примеры
Базовое использование:
>>> biproduct (42, 17) 714
>>> biproduct (Right 42) 42
>>> biproduct (BiList [13, 29, 4] [18, 1, 7]) 190008
>>> biproduct (BiList [13, 29, 4] []) 1508
>>> biproduct (BiList [] []) 1
С версии: base-4.10.0.0
biconcat :: Bifoldable t => t [a] [a] -> [a] Source
Преобразует структуру списков в конкатенацию этих списков.
Примеры
Базовое использование:
>>> biconcat ([1, 2, 3], [4, 5]) [1,2,3,4,5]
>>> biconcat (Left [1, 2, 3]) [1,2,3]
>>> biconcat (BiList [[1, 2, 3, 4, 5], [6, 7, 8]] [[9]]) [1,2,3,4,5,6,7,8,9]
С версии: base-4.10.0.0
biconcatMap :: Bifoldable t => (a -> [c]) -> (b -> [c]) -> t a b -> [c] Source
При заданном способе отображения элементов структуры в списки, вычисляет конкатенацию всех таких списков в порядке.
Примеры
Базовое использование:
>>> biconcatMap (take 3) (fmap digitToInt) ([1..], "89") [1,2,3,8,9]
>>> biconcatMap (take 3) (fmap digitToInt) (Left [1..]) [1,2,3]
>>> biconcatMap (take 3) (fmap digitToInt) (Right "89") [8,9]
С версии: base-4.10.0.0
biand :: Bifoldable t => t Bool Bool -> Bool Source
biand возвращает конъюнкцию контейнера булевых значений. Для получения результата True, контейнер должен быть конечным; False, однако, результат получается от False значения, конечное расстояние от левого конца.
Примеры
Базовое использование:
>>> biand (True, False) False
>>> biand (True, True) True
>>> biand (Left True) True
Пустые структуры возвращают True:
>>> biand (BiList [] []) True
Значение False на конечном расстоянии от левого конца возвращает False (короткое замыкание):
>>> biand (BiList [True, True, False, True] (repeat True)) False
Значение False на бесконечном расстоянии от левого конца висит:
> biand (BiList (repeat True) [False]) * Hangs forever *
Бесконечное True значение висит:
> biand (BiList (repeat True) []) * Hangs forever *
С версии: base-4.10.0.0
bior :: Bifoldable t => t Bool Bool -> Bool Source
bior возвращает дизъюнкцию контейнера булевых значений. Для получения результата False, контейнер должен быть конечным; True, однако, результат получается от True значения, конечное расстояние от левого конца.
Примеры
Базовое использование:
>>> bior (True, False) True
>>> bior (False, False) False
>>> bior (Left True) True
Пустые структуры возвращают False:
>>> bior (BiList [] []) False
Значение True на конечном расстоянии от левого конца возвращает True (короткое замыкание):
>>> bior (BiList [False, False, True, False] (repeat False)) True
Значение True на бесконечном расстоянии от левого конца висит:
> bior (BiList (repeat False) [True]) * Hangs forever *
Бесконечное False значение висит:
> bior (BiList (repeat False) []) * Hangs forever *
С версии: base-4.10.0.0
biany :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool Source
Определяет, удовлетворяет ли какой-либо элемент структуры соответствующему аргументу предиката. Пустые структуры возвращают False.
Примеры
Базовое использование:
>>> biany even isDigit (27, 't') False
>>> biany even isDigit (27, '8') True
>>> biany even isDigit (26, 't') True
>>> biany even isDigit (Left 27) False
>>> biany even isDigit (Left 26) True
>>> biany even isDigit (BiList [27, 53] ['t', '8']) True
Пустые структуры возвращают False:
>>> biany even isDigit (BiList [] []) False
С версии: base-4.10.0.0
biall :: Bifoldable t => (a -> Bool) -> (b -> Bool) -> t a b -> Bool Source
Определяет, удовлетворяют ли все элементы структуры соответствующему аргументу предиката. Пустые структуры возвращают True.
Примеры
Базовое использование:
>>> biall even isDigit (27, 't') False
>>> biall even isDigit (26, '8') True
>>> biall even isDigit (Left 27) False
>>> biall even isDigit (Left 26) True
>>> biall even isDigit (BiList [26, 52] ['3', '8']) True
Пустые структуры возвращают True:
>>> biall even isDigit (BiList [] []) True
С версии: base-4.10.0.0
bimaximumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a Source
Наибольший элемент непустой структуры относительно заданной функции сравнения. Порядок структуры используется как решающий фактор при ничьих: если есть несколько наибольших элементов, выбирается самый правый из них.
Примеры
Основное использование:
>>> bimaximumBy compare (42, 17) 42
>>> bimaximumBy compare (Left 17) 17
>>> bimaximumBy compare (BiList [42, 17, 23] [-5, 18]) 42
На пустых структурах эта функция выбрасывает исключение:
>>> bimaximumBy compare (BiList [] []) *** Exception: bifoldr1: empty structure ...
С тех пор: base-4.10.0.0
biminimumBy :: Bifoldable t => (a -> a -> Ordering) -> t a a -> a Источник
Наименьший элемент непустой структуры относительно заданной функции сравнения. Порядок структуры используется для определения ничьих: если существует несколько наименьших элементов, выбирается самый левый из них.
Примеры
Основное использование:
>>> biminimumBy compare (42, 17) 17
>>> biminimumBy compare (Left 17) 17
>>> biminimumBy compare (BiList [42, 17, 23] [-5, 18]) -5
На пустых структурах эта функция выбрасывает исключение:
>>> biminimumBy compare (BiList [] []) *** Exception: bifoldr1: empty structure ...
С тех пор: base-4.10.0.0
binotElem :: (Bifoldable t, Eq a) => a -> t a a -> Bool Источник
binotElem — это отрицание bielem.
Примеры
Основное использование:
>>> binotElem 42 (17, 42) False
>>> binotElem 42 (17, 43) True
>>> binotElem 42 (Left 42) False
>>> binotElem 42 (Right 13) True
>>> binotElem 42 (BiList [1..5] [1..100]) False
>>> binotElem 42 (BiList [1..5] [1..41]) True
С тех пор: base-4.10.0.0
bifind :: Bifoldable t => (a -> Bool) -> t a a -> Maybe a Источник
Функция bifind принимает предикат и структуру и возвращает самый левый элемент структуры, соответствующий предикату, или Nothing, если такого элемента нет.
Примеры
Основное использование:
>>> bifind even (27, 53) Nothing
>>> bifind even (27, 52) Just 52
>>> bifind even (26, 52) Just 26
Пустые структуры всегда возвращают Nothing:
>>> bifind even (BiList [] []) Nothing
С тех пор: base-4.10.0.0
© 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/Data-Bifoldable.html