Data.Bitraversable
| Авторские права | (C) 2011-2016 Edward Kmett |
|---|---|
| Лицензия | BSD-style (см. файл LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | portable |
| Безопасный Haskell | Trustworthy |
| Язык | Haskell2010 |
Описание
Начиная с: base-4.10.0.0
class (Bifunctor t, Bifoldable t) => Bitraversable (t :: Type -> Type -> Type) where Исходный код
Bitraversable обозначает бифункториальные структуры данных, элементы которых можно обходить по порядку, выполняя действия Applicative или Monad над каждым элементом и собирая результирующую структуру той же формы.
В отличие от структур данных Traversable, в которых имеется один тип элементов, над которыми можно выполнять действие, структуры данных Bitraversable содержат два таких типа элементов.
Определение bitraverse должно удовлетворять следующим законам:
- Естественность
-
bitraverse (t . f) (t . g) ≡ t . bitraverse f gдля каждого аппликативного преобразованияt - Тождественность
bitraverse Identity Identity ≡ Identity- Композиция
Compose . fmap (bitraverse g1 g2) . bitraverse f1 f2 ≡ bitraverse (Compose . fmap g1 . f1) (Compose . fmap g2 . f2)
где аппликативное преобразование — это функция
t :: (Applicative f, Applicative g) => f a -> g a
сохраняющая операции Applicative:
t (pure x) ≡ pure x t (f <*> x) ≡ t f <*> t x
а функтор тождества Identity и функторы композиции Compose находятся в модулях Data.Functor.Identity и Data.Functor.Compose.
Простые примеры — Either и (,):
instance Bitraversable Either where bitraverse f _ (Left x) = Left <$> f x bitraverse _ g (Right y) = Right <$> g y instance Bitraversable (,) where bitraverse f g (x, y) = (,) <$> f x <*> g y
Bitraversable связан со своими суперклассами следующим образом:
bimap f g ≡ runIdentity . bitraverse (Identity . f) (Identity . g) bifoldMap f g ≡ getConst . bitraverse (Const . f) (Const . g)
Они доступны соответственно как bimapDefault и bifoldMapDefault.
Если тип также является экземпляром Traversable, он должен удовлетворять следующему условию (с точностью до ленивости):
traverse ≡ bitraverse pure
Начиная с: base-4.10.0.0
Методы
bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d) Исходный код
Вычисляет соответствующие функции для каждого элемента структуры, выполняя действие, и строит новую структуру той же формы, используя результаты последовательного выполнения действий.
bitraverse f g ≡ bisequenceA . bimap f g
Вариант, который игнорирует результаты, см. в bitraverse_.
Примеры
Базовое использование:
>>> bitraverse listToMaybe (find odd) (Left []) Nothing
>>> bitraverse listToMaybe (find odd) (Left [1, 2, 3]) Just (Left 1)
>>> bitraverse listToMaybe (find odd) (Right [4, 5]) Just (Right 5)
>>> bitraverse listToMaybe (find odd) ([1, 2, 3], [4, 5]) Just (1,5)
>>> bitraverse listToMaybe (find odd) ([], [4, 5]) Nothing
Начиная с: base-4.10.0.0
Экземпляры
| Bitraversable Arg Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Semigroup Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Arg a b -> f (Arg c d) Исходный код | |
| Bitraversable Either Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Either a b -> f (Either c d) Исходный код | |
| Bitraversable (,) Исходный код |
bitraverse pure ≡ traverse не выполняется для кортежей, если используется ленивость: >>> (bitraverse pure pure undefined :: IO (Int, Word)) `seq` () () >>> (traverse pure (errorWithoutStackTrace "error!") :: IO (Int, Word)) `seq` () *** Exception: error! Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (a, b) -> f (c, d) Исходный код | |
| Bitraversable (Const :: Type -> Type -> Type) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Const a b -> f (Const c d) Исходный код | |
| Bitraversable ((,,) x) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, a, b) -> f (x, c, d) Исходный код | |
| Bitraversable (K1 i :: Type -> Type -> Type) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> K1 i a b -> f (K1 i c d) Исходный код | |
| Bitraversable ((,,,) x y) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, a, b) -> f (x, y, c, d) Исходный код | |
| Bitraversable ((,,,,) x y z) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, z, a, b) -> f (x, y, z, c, d) Исходный код | |
| Bitraversable ((,,,,,) x y z w) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, z, w, a, b) -> f (x, y, z, w, c, d) Исходный код | |
| Bitraversable ((,,,,,,) x y z w v) Исходный код | Начиная с: base-4.10.0.0 |
Определён в Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, z, w, v, a, b) -> f (x, y, z, w, v, c, d) Исходный код | |
bisequenceA :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b) Исходный код
Псевдоним для bisequence.
Начиная с: base-4.10.0.0
bisequence :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b) Исходный код
Последовательно выполняет все действия в структуре и строит новую структуру той же формы, используя результаты этих действий. Вариант, который игнорирует результаты, см. в bisequence_.
bisequence ≡ bitraverse id id
Примеры
Базовое использование:
>>> bisequence (Just 4, Nothing) Nothing
>>> bisequence (Just 4, Just 5) Just (4,5)
>>> bisequence ([1, 2, 3], [4, 5]) [(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]
Начиная с: base-4.10.0.0
bimapM :: (Bitraversable t, Applicative f) => (a -> f c) -> (b -> f d) -> t a b -> f (t c d) Исходный код
Псевдоним для bitraverse.
Начиная с: base-4.10.0.0
firstA :: (Bitraversable t, Applicative f) => (a -> f c) -> t a b -> f (t c b) Исходный код
Обходит только первый аргумент.
firstA f ≡ bitraverse f pure
secondA :: (Bitraversable t, Applicative f) => (b -> f c) -> t a b -> f (t a c) Исходный код
Обходит только второй аргумент.
secondA f ≡ bitraverse pure f
Примеры
Базовое использование:
>>> secondA (find odd) (Left []) Just (Left [])
>>> secondA (find odd) (Left [1, 2, 3]) Just (Left [1,2,3])
>>> secondA (find odd) (Right [4, 5]) Just (Right 5)
>>> secondA (find odd) ([1, 2, 3], [4, 5]) Just ([1,2,3],5)
>>> secondA (find odd) ([1,2,3], [4]) Nothing
Начиная с: base-4.21.0.0
bifor :: (Bitraversable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f (t c d) Исходный код
bifor — это bitraverse, в котором структура передаётся первым аргументом. Вариант, который игнорирует результаты, см. в bifor_.
Примеры
Базовое использование:
>>> bifor (Left []) listToMaybe (find even) Nothing
>>> bifor (Left [1, 2, 3]) listToMaybe (find even) Just (Left 1)
>>> bifor (Right [4, 5]) listToMaybe (find even) Just (Right 4)
>>> bifor ([1, 2, 3], [4, 5]) listToMaybe (find even) Just (1,4)
>>> bifor ([], [4, 5]) listToMaybe (find even) Nothing
Начиная с: base-4.10.0.0
biforM :: (Bitraversable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f (t c d) Исходный код
Псевдоним для bifor.
Начиная с: base-4.10.0.0
bimapAccumL :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e) Исходный код
Функция bimapAccumL действует как комбинация bimap и bifoldl; она обходит структуру слева направо, передавая состояние типа a и используя заданные действия для вычисления новых элементов структуры.
Примеры
Базовое использование:
>>> bimapAccumL (\acc bool -> (acc + 1, show bool)) (\acc string -> (acc * 2, reverse string)) 3 (True, "foo")
(8,("True","oof"))
Начиная с: base-4.10.0.0
bimapAccumR :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e) Исходный код
Функция bimapAccumR действует как комбинация bimap и bifoldr; она обходит структуру справа налево, передавая состояние типа a и используя заданные действия для вычисления новых элементов структуры.
Примеры
Базовое использование:
>>> bimapAccumR (\acc bool -> (acc + 1, show bool)) (\acc string -> (acc * 2, reverse string)) 3 (True, "foo")
(7,("True","oof"))
Начиная с: base-4.10.0.0
bimapDefault :: Bitraversable t => (a -> b) -> (c -> d) -> t a c -> t b d Исходный код
Определение bimap по умолчанию через операции Bitraversable.
bimapDefault f g ≡ runIdentity . bitraverse (Identity . f) (Identity . g)
Начиная с: base-4.10.0.0
bifoldMapDefault :: (Bitraversable t, Monoid m) => (a -> m) -> (b -> m) -> t a b -> m Исходный код
Определение bifoldMap по умолчанию через операции Bitraversable.
bifoldMapDefault f g ≡ getConst . bitraverse (Const . f) (Const . g)
Начиная с: 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.14.1/docs/libraries/base-4.22.0.0-66f8/Data-Bitraversable.html