Data.Traversable
| Авторские права | Conor McBride и Ross Paterson 2005 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE в дистрибутиве) |
| Поддержка | libraries@haskell.org |
| Стабильность | экспериментальная |
| Переносимость | переносимая |
| Безопасный Haskell | Достоверный |
| Язык | Haskell2010 |
Описание
Класс структур данных, которые можно проходить слева направо, выполняя действие над каждым элементом.
См. также
- "Прикладное программирование с эффектами", Conor McBride и Ross Paterson, Журнал функционального программирования 18:1 (2008) 1-13, онлайн по адресу http://www.soi.city.ac.uk/~ross/papers/Applicative.html.
- "Суть паттерна итератора", Jeremy Gibbons и Bruno Oliveira, в Математически структурированном функциональном программировании, 2006, онлайн по адресу http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/#iterator.
- "Исследование законов проходов", Mauro Jaskelioff и Ondrej Rypacek, в Математически структурированном функциональном программировании, 2012, онлайн по адресу http://arxiv.org/pdf/1202.2919.
Класс Traversable
class (Functor t, Foldable t) => Traversable t where Исходный код
Функторы, представляющие структуры данных, которые можно обходить слева направо.
Определение traverse должно удовлетворять следующим законам:
- Естественность
-
t . traverse f = traverse (t . f)для каждой прикладной трансформацииt - Тождество
traverse Identity = Identity- Композиция
traverse (Compose . fmap g . f) = Compose . fmap (traverse g) . traverse f
Определение sequenceA должно удовлетворять следующим законам:
- Естественность
-
t . sequenceA = sequenceA . fmap tдля каждой прикладной трансформацииt - Тождество
sequenceA . fmap Identity = Identity- Композиция
sequenceA . fmap Compose = Compose . fmap sequenceA . sequenceA
где прикладная трансформация — это функция
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.
Результатом закона естественности является закон чистоты для traverse
traverse pure = pure
(Закон естественности подразумевается параметричностью, а значит, подразумевается и закон чистоты [1, с. 15]).
Примеры аналогичны Functor, например, задан тип данных
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
подходящий экземпляр будет
instance Traversable Tree where traverse f Empty = pure Empty traverse f (Leaf x) = Leaf <$> f x traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r
Это подходит даже для абстрактных типов, так как законы для <*> подразумевают форму ассоциативности.
Экземпляры суперклассов должны удовлетворять следующим условиям:
- В экземпляре
Functor,fmapдолжен быть эквивалентен прохождению с тождественным прикладным функтором (fmapDefault). - В экземпляре
Foldable,foldMapдолжен быть эквивалентен прохождению с постоянным прикладным функтором (foldMapDefault).
Ссылки: [1] Суть паттерна итератора, Jeremy Gibbons и Bruno C. d. S. Oliveira
Методы
traverse :: Applicative f => (a -> f b) -> t a -> f (t b) Исходный код
Применяет к каждому элементу структуры действие, оценивает эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. traverse_.
sequenceA :: Applicative f => t (f a) -> f (t a) Исходный код
Вычисляет каждое действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequenceA_.
mapM :: Monad m => (a -> m b) -> t a -> m (t b) Исходный код
Применяет к каждому элементу структуры монадическое действие, вычисляет эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. mapM_.
sequence :: Monad m => t (m a) -> m (t a) Исходный код
Вычисляет каждое монадическое действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequence_.
Примеры
| Traversable [] | С тех пор как: base-2.1 |
Определено в Data.Traversable | |
| Traversable Maybe | С тех пор как: base-2.1 |
Определено в Data.Traversable | |
| Traversable Par1 | С тех пор как: base-4.9.0.0 |
| Traversable NonEmpty | С тех пор как: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable Down | С тех пор как: base-4.12.0.0 |
| Traversable Product | С тех пор как: base-4.8.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> Product a -> f (Product b) Исходный код sequenceA :: Applicative f => Product (f a) -> f (Product a) Исходный код mapM :: Monad m => (a -> m b) -> Product a -> m (Product b) Исходный код sequence :: Monad m => Product (m a) -> m (Product a) Исходный код | |
| Traversable Sum | С версии: base-4.8.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> Sum a -> f (Sum b) Исходный код sequenceA :: Applicative f => Sum (f a) -> f (Sum a) Исходный код mapM :: Monad m => (a -> m b) -> Sum a -> m (Sum b) Исходный код sequence :: Monad m => Sum (m a) -> m (Sum a) Исходный код | |
| Traversable Dual | С версии: base-4.8.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> Dual a -> f (Dual b) Исходный код sequenceA :: Applicative f => Dual (f a) -> f (Dual a) Исходный код mapM :: Monad m => (a -> m b) -> Dual a -> m (Dual b) Исходный код sequence :: Monad m => Dual (m a) -> m (Dual a) Исходный код | |
| Traversable Last | С версии: base-4.8.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> Last a -> f (Last b) Исходный код sequenceA :: Applicative f => Last (f a) -> f (Last a) Исходный код mapM :: Monad m => (a -> m b) -> Last a -> m (Last b) Исходный код sequence :: Monad m => Last (m a) -> m (Last a) Исходный код | |
| Traversable First | С версии: base-4.8.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> First a -> f (First b) Исходный код sequenceA :: Applicative f => First (f a) -> f (First a) Исходный код mapM :: Monad m => (a -> m b) -> First a -> m (First b) Исходный код sequence :: Monad m => First (m a) -> m (First a) Исходный код | |
| Traversable Identity | С версии: base-4.9.0.0 |
Определено в Data.Traversable Краткое описание методовtraverse :: Applicative f => (a -> f b) -> Identity a -> f (Identity b) Source sequenceA :: Applicative f => Identity (f a) -> f (Identity a) Source mapM :: Monad m => (a -> m b) -> Identity a -> m (Identity b) Source sequence :: Monad m => Identity (m a) -> m (Identity a) Source | |
| Traversable ZipList | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable Option | Since: base-4.9.0.0 |
Определено в Data.Semigroup | |
| Traversable Last | Since: base-4.9.0.0 |
Определено в Data.Semigroup | |
| Traversable First | Since: base-4.9.0.0 |
Определено в Data.Semigroup | |
| Traversable Max | Since: base-4.9.0.0 |
| Traversable Min | Since: base-4.9.0.0 |
| Traversable Complex | Since: base-4.9.0.0 |
Defined in Data.Complex | |
| Traversable (Either a) | Since: base-4.7.0.0 |
Defined in Data.Traversable | |
| Traversable (V1 :: Type -> Type) | Since: base-4.9.0.0 |
| Traversable (U1 :: Type -> Type) | Since: base-4.9.0.0 |
| Traversable (UAddr :: Type -> Type) | Since: base-4.9.0.0 |
| Traversable (UChar :: Type -> Type) | Since: base-4.9.0.0 |
| Traversable (UDouble :: Type -> Type) | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable (UFloat :: Type -> Type) | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable (UInt :: Type -> Type) | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable (UWord :: Type -> Type) | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable ((,) a) | Since: base-4.7.0.0 |
Определено в Data.Traversable | |
| Ix i => Traversable (Array i) | Since: base-2.1 |
Определено в Data.Traversable | |
| Traversable (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
Определено в Data.Traversable | |
| Traversable (Arg a) | Since: base-4.9.0.0 |
Определено в Data.Semigroup | |
| Traversable f => Traversable (Rec1 f) | Since: base-4.9.0.0 |
Определено в Data.Traversable | |
| Traversable f => Traversable (Alt f) | Since: base-4.12.0.0 |
Определено в Data.Traversable | |
| Traversable f => Traversable (Ap f) | Since: base-4.12.0.0 |
Определено в Data.Traversable | |
| Traversable (Const m :: Type -> Type) | Since: base-4.7.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> Const m a -> f (Const m b) Исходный код sequenceA :: Applicative f => Const m (f a) -> f (Const m a) Исходный код mapM :: Monad m0 => (a -> m0 b) -> Const m a -> m0 (Const m b) Исходный код sequence :: Monad m0 => Const m (m0 a) -> m0 (Const m a) Исходный код | |
| Traversable (K1 i c :: Тип -> Тип) | С тех пор как: base-4.9.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f => (a -> f b) -> K1 i c a -> f (K1 i c b) Исходный код sequenceA :: Applicative f => K1 i c (f a) -> f (K1 i c a) Исходный код mapM :: Монадный m => (a -> m b) -> K1 i c a -> m (K1 i c b) Исходный код sequence :: Монадный m => K1 i c (m a) -> m (K1 i c a) Исходный код | |
| (Traversable f, Traversable g) => Traversable (f :+: g) | С тех пор как: base-4.9.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f0 => (a -> f0 b) -> (f :+: g) a -> f0 ((f :+: g) b) Исходный код sequenceA :: Applicative f0 => (f :+: g) (f0 a) -> f0 ((f :+: g) a) Исходный код mapM :: Монадный m => (a -> m b) -> (f :+: g) a -> m ((f :+: g) b) Исходный код sequence :: Монадный m => (f :+: g) (m a) -> m ((f :+: g) a) Исходный код | |
| (Traversable f, Traversable g) => Traversable (f :*: g) | С тех пор как: base-4.9.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f0 => (a -> f0 b) -> (f :*: g) a -> f0 ((f :*: g) b) Исходный код sequenceA :: Applicative f0 => (f :*: g) (f0 a) -> f0 ((f :*: g) a) Исходный код mapM :: Монадный m => (a -> m b) -> (f :*: g) a -> m ((f :*: g) b) Исходный код sequence :: Монадный m => (f :*: g) (m a) -> m ((f :*: g) a) Исходный код | |
| (Traversable f, Traversable g) => Traversable (Sum f g) | С тех пор как: base-4.9.0.0 |
Определено в Data.Functor.Sum | |
| (Traversable f, Traversable g) => Traversable (Product f g) | С момента версии: base-4.9.0.0 |
Определено в Data.Functor.Product Методыtraverse :: Applicative f0 => (a -> f0 b) -> Product f g a -> f0 (Product f g b) Source sequenceA :: Applicative f0 => Product f g (f0 a) -> f0 (Product f g a) Source mapM :: Monad m => (a -> m b) -> Product f g a -> m (Product f g b) Source sequence :: Monad m => Product f g (m a) -> m (Product f g a) Source | |
| Traversable f => Traversable (M1 i c f) | С момента версии: base-4.9.0.0 |
Определено в Data.Traversable | |
| (Traversable f, Traversable g) => Traversable (f :.: g) | С момента версии: base-4.9.0.0 |
Определено в Data.Traversable Методыtraverse :: Applicative f0 => (a -> f0 b) -> (f :.: g) a -> f0 ((f :.: g) b) Source sequenceA :: Applicative f0 => (f :.: g) (f0 a) -> f0 ((f :.: g) a) Source mapM :: Monad m => (a -> m b) -> (f :.: g) a -> m ((f :.: g) b) Source sequence :: Monad m => (f :.: g) (m a) -> m ((f :.: g) a) Source | |
| (Traversable f, Traversable g) => Traversable (Compose f g) | С момента версии: base-4.9.0.0 |
Определено в Data.Functor.Compose Методыtraverse :: Applicative f0 => (a -> f0 b) -> Compose f g a -> f0 (Compose f g b) Источник sequenceA :: Applicative f0 => Compose f g (f0 a) -> f0 (Compose f g a) Источник mapM :: Monad m => (a -> m b) -> Compose f g a -> m (Compose f g b) Источник sequence :: Monad m => Compose f g (m a) -> m (Compose f g a) Источник |
Вспомогательные функции
for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b) Источник
for является traverse со своими аргументами, поменяв местами. Для версии, которая игнорирует результаты, см. for_.
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) Источник
forM является mapM со своими аргументами, поменяв местами. Для версии, которая игнорирует результаты, см. forM_.
mapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) Источник
Функция mapAccumL ведет себя как комбинация fmap и foldl; она применяет функцию к каждому элементу структуры, передавая накопительный параметр слева направо и возвращая конечное значение этого накопителя вместе с новой структурой.
mapAccumR :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) Источник
Функция mapAccumR ведет себя как комбинация fmap и foldr; она применяет функцию к каждому элементу структуры, передавая накопительный параметр справа налево и возвращая конечное значение этого накопителя вместе с новой структурой.
Общие определения для методов суперкласса
fmapDefault :: forall t a b. Traversable t => (a -> b) -> t a -> t b Источник
Эта функция может быть использована в качестве значения для fmap в экземпляре Functor, при условии, что traverse определено. (Использование fmapDefault с экземпляром Traversable , определённым только sequenceA , приведёт к бесконечной рекурсии.)
fmapDefault f ≡ runIdentity . traverse (Identity . f)
foldMapDefault :: forall t m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m Источник
Эта функция может быть использована в качестве значения для foldMap в экземпляре Foldable.
foldMapDefault f ≡ getConst . traverse (Const . f)
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Data-Traversable.html