Data.Bitraversable
| Авторские права | (C) 2011-2016 Edward Kmett |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Портируемость | портируемая |
| Safe Haskell | Достоверный |
| Язык | 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 Source | Since: base-4.10.0.0 |
Defined in Data.Semigroup Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Arg a b -> f (Arg c d) Source | |
| Bitraversable Either Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Either a b -> f (Either c d) Source | |
| Bitraversable (,) Source |
Законы класса для кортежей верны только с учетом ленивости. Методы Bitraversable более ленивы, чем их аналоги в Traversable. Например, закон >>> (bitraverse pure pure undefined :: IO (Int, Word)) `seq` () () >>> (traverse pure (errorWithoutStackTrace "error!") :: IO (Int, Word)) `seq` () *** Exception: error! Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (a, b) -> f (c, d) Source | |
| Bitraversable (Const :: Type -> Type -> Type) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> Const a b -> f (Const c d) Source | |
| Bitraversable ((,,) x) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, a, b) -> f (x, c, d) Source | |
| Bitraversable (K1 i :: Type -> Type -> Type) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> K1 i a b -> f (K1 i c d) Source | |
| Bitraversable ((,,,) x y) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, a, b) -> f (x, y, c, d) Source | |
| Bitraversable ((,,,,) x y z) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, z, a, b) -> f (x, y, z, c, d) Source | |
| Bitraversable ((,,,,,) x y z w) Source | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Методыbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> (x, y, z, w, a, b) -> f (x, y, z, w, c, d) Source | |
| Bitraversable ((,,,,,,) x y z w v) Source | Since: 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.12.1/docs/libraries/base-4.21.0.0-8e62/Data-Bitraversable.html