Главная » Haskell » Модуль Traversable

0

В модуле Traversable описан класс типов данных, которые могут быть поэлементно перебраны слева направо, при этом над элементами могут совершаться дополнительные действия. Этот класс описывает специальный вид функторов, как это определено в работах [15, 6]. Использование:

import Data.Traversable

Необходимо отметить,  что   в  этом  модуле  определены   функции   mapM

и sequence, которые также определены в стандартном модуле Prelude, поэтому

необходимо либо скрывать стандартные функции, либо импортировать рассматриваемый модуль квалифицированно.

Главная  программная  сущность,  описанная  в   этом  модуле,  —   класс

Traversable.

Класс: Traversable

Описание: функтор, представляющий структуры  данных, которые  могут быть перебраны слева направо. В экземплярах обязательными для определения являются метод traverse либо метод sequenceA. Остальные методы имеют определение по умолчанию.

Определение:

class (Functor t, Foldable t) => Traversable  t where

traverse   :: Applicative f => (a  ->  f b)  ->  t a ->  f (t b) sequenceA :: Applicative f => t (f a)  ->  f  (t a)

mapM               :: Monad  m   => (a  ->  m   b)  ->  t a ->  m   (t b) sequence   :: Monad  m   => t (m a)  ->  m  (t a)

Метод traverse позволяет обойти структуру данных слева направо, преобразуя значения из неё в действия. Действия выполняются по мере обхода, результат собирается. Окончательный  результат возвращается методом. Также и метод sequenceA выполняет каждое действие в структуре, собирая и затем возвращая результат.

Метод mapM преобразует каждое действие внутри структуры в монадическое действие (для заданной монады), выполняет все действия слева направо и возвращает результат выполнения. Также  и метод  sequence выполняет слева направо уже монадические в рамках структуры действия, собирает и возвращает результат выполнения.

Экземплярами этого класса являются следующие типы данных: Digit, Elem,

FingerTree,  Maybe, Node, Seq, Tree, ViewL, ViewR, Array, Map и [].

Функция: for

Описание: вариант метода traverse, к которого порядок следования аргументов обратный.

Определение:

for :: (Traversable t, Applicative f) => t a ->  (a  ->  f b)  ->  f (t b) for = flip  traverse

Функция: forM

Описание: вариант метода mapM, у которого порядок следования аргументов обратный.

Определение:

forM  :: (Traversable t, Monad  m) => t a ->  (a  ->  m  b)  ->  m   (t b) forM  = flip mapM

Функция: fmapDefault

Описание: эта функция может быть использована в качестве аргумента для метода fmap в экземплярах класса Functor  (см. стр. 211).

Определение:

fmapDefault :: Traversable t => (a  ->  b)  ->  t a ->  t b fmapDefault f = getId .  traverse (Id . f)

Функция: foldMapDefault

Описание: эта функция может быть использована в качестве аргумента для метода foldMap в экземплярах класса Foldable  (см. стр. 306).

Определение:

foldMapDefault :: (Traversable t, Monoid m) => (a  ->  m)  ->  t a ->  m foldMapDefault f = getConst  . traverse  (Const  . f)

Данный модуль является обновлённой и более совершенной версией модуля FunctorM, который в свою очередь объявлен устаревшим и выводится из состава стандартных библиотек языка Haskell. Совместно с модулем Foldable  (см. раздел 8.11.) этот модуль предоставляет всю функциональность (и даже больше), которую предоставлял модуль FunctorM.

Остаётся отметить, что  за этот модуль в поставке  языка  Haskell отвечает Р.  Патерсон, с которым  можно  связаться по  адресу электронной почты ross@soi.city.ac.uk.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии