Spec-Zone.ru › Haskell 9

Control.Monad

Авторские права (c) Университет Глазго 2001
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддерживающий libraries@haskell.org
Стабильность предварительная
Переносимость переносимая
Безопасный Haskell Безопасный
Язык Haskell2010

Содержание

  • Классы Functor и monad
  • Функции
    • Конвенции именования
    • Обобщения функций списка
    • Условное выполнение монадических выражений
    • Операторы подъема монады
    • Строгие монадические функции

Описание

Классы Functor, Monad и MonadPlus, с некоторыми полезными операциями над монадами.

Классы Functor и monad

class Functor (f :: Type -> Type) where Источник

Тип f является Functor, если он предоставляет функцию fmap, которая, учитывая любые типы a и b, позволяет вам применять любую функцию из (a -> b) для преобразования f a в f b, сохраняя структуру f. Кроме того, f должен соответствовать следующим правилам:

Тождество
fmap id == id
Композиция
fmap (f . g) == fmap f . fmap g

Обратите внимание, что второе правило вытекает из свободной теоремы типа fmap и первого правила, поэтому вам нужно только проверить, что выполняется первое условие. См. статьи School of Haskell или Дэвида Лупошайинского для объяснения.

Минимальное полное определение

fmap

Методы

fmap :: (a -> b) -> f a -> f b Источник

fmap используется для применения функции типа (a -> b) к значению типа f a, где f — функтор, для получения значения типа f b. Обратите внимание, что для любого конструктора типа с более чем одним параметром (например, Either) только последний параметр типа может быть изменён с помощью fmap (например, b в `Either a b`).

Некоторые конструкторы типов с двумя и более параметрами имеют экземпляр Bifunctor, который позволяет отображать как последний, так и предпоследний параметры.

Примеры
Развернуть

Преобразование из Maybe Int в Maybe String с помощью show:

>>> fmap show Nothing
Nothing
>>> fmap show (Just 3)
Just "3"

Преобразование из Either Int Int в Either Int String с помощью show:

>>> fmap show (Left 17)
Left 17
>>> fmap show (Right 17)
Right "17"

Удвоение каждого элемента списка:

>>> fmap (*2) [1,2,3]
[2,4,6]

Применение even ко второму элементу пары:

>>> fmap even (2,2)
(2,True)

Возможно, удивительно, что функция применяется только к последнему элементу кортежа по сравнению с примером со списком, где она применяется ко всем элементам списка. Чтобы понять это, вспомните, что кортежи — это конструкторы типов с несколькими параметрами типа: кортеж из 3 элементов (a,b,c) также может быть записан как (,,) a b c, и его экземпляр Functor определён для Functor ((,,) a b) (т.е. только третий параметр можно отображать с помощью fmap).

Это объясняет, почему fmap можно использовать с кортежами, содержащими значения разных типов, как в следующем примере:

>>> fmap even ("hello", 1.0, 4)
("hello",1.0,True)

(<$) :: a -> f b -> f a infixl 4 Источник

Замена всех позиций ввода одним и тем же значением. По умолчанию это fmap . const, но это может быть переопределено более эффективной версией.

Примеры
Развернуть

Выполнение вычисления с Maybe и замена результата постоянным значением, если он Just:

>>> 'a' <$ Just 2
Just 'a'
>>> 'a' <$ Nothing
Nothing
Экземпляры
Подробности экземпляров
Functor Complex Source

Since: base-4.9.0.0

Instance details

Определено в Data.Complex

Methods

fmap :: (a -> b) -> Complex a -> Complex b Source

(<$) :: a -> Complex b -> Complex a Source

Functor First Source

Since: base-4.9.0.0

Instance details

Определено в Data.Semigroup

Methods

fmap :: (a -> b) -> First a -> First b Source

(<$) :: a -> First b -> First a Source

Functor Last Source

Since: base-4.9.0.0

Instance details

Определено в Data.Semigroup

Methods

fmap :: (a -> b) -> Last a -> Last b Source

(<$) :: a -> Last b -> Last a Source

Functor Max Source

Since: base-4.9.0.0

Instance details

Определено в Data.Semigroup

Methods

fmap :: (a -> b) -> Max a -> Max b Source

(<$) :: a -> Max b -> Max a Source

Functor Min Source

Since: base-4.9.0.0

Instance details

Определено в Data.Semigroup

Methods

fmap :: (a -> b) -> Min a -> Min b Source

(<$) :: a -> Min b -> Min a Source

Functor ArgDescr Source

Since: base-4.7.0.0

Instance details

Определено в System.Console.GetOpt

Methods

fmap :: (a -> b) -> ArgDescr a -> ArgDescr b Source

(<$) :: a -> ArgDescr b -> ArgDescr a Source

Functor ArgOrder Source

Since: base-4.7.0.0

Instance details

Определено в System.Console.GetOpt

Methods

fmap :: (a -> b) -> ArgOrder a -> ArgOrder b Source

(<$) :: a -> ArgOrder b -> ArgOrder a Source

Functor OptDescr Source

Since: base-4.7.0.0

Instance details

Определено в System.Console.GetOpt

Methods

fmap :: (a -> b) -> OptDescr a -> OptDescr b Source

(<$) :: a -> OptDescr b -> OptDescr a Source

Functor NonEmpty Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Base

Методы

fmap :: (a -> b) -> NonEmpty a -> NonEmpty b Исходный код

(<$) :: a -> NonEmpty b -> NonEmpty a Исходный код

Functor STM Исходный код

С момента: base-4.3.0.0

Подробности экземпляра

Определено в GHC.Internal.Conc.Sync

Методы

fmap :: (a -> b) -> STM a -> STM b Исходный код

(<$) :: a -> STM b -> STM a Исходный код

Functor Handler Исходный код

С момента: base-4.6.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Exception

Методы

fmap :: (a -> b) -> Handler a -> Handler b Исходный код

(<$) :: a -> Handler b -> Handler a Исходный код

Functor Identity Исходный код

С момента: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Functor.Identity

Методы

fmap :: (a -> b) -> Identity a -> Identity b Исходный код

(<$) :: a -> Identity b -> Identity a Исходный код

Functor First Исходный код

С момента: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Monoid

Методы

fmap :: (a -> b) -> First a -> First b Исходный код

(<$) :: a -> First b -> First a Исходный код

Functor Last Исходный код

С момента: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Monoid

Методы

fmap :: (a -> b) -> Last a -> Last b Исходный код

(<$) :: a -> Last b -> Last a Исходный код

Functor Down Исходный код

С момента: base-4.11.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Ord

Методы

fmap :: (a -> b) -> Down a -> Down b Исходный код

(<$) :: a -> Down b -> Down a Исходный код

Functor Dual Исходный код

С момента: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

fmap :: (a -> b) -> Dual a -> Dual b Исходный код

(<$) :: a -> Dual b -> Dual a Исходный код

Functor Product Source

Since: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

fmap :: (a -> b) -> Product a -> Product b Source

(<$) :: a -> Product b -> Product a Source

Functor Sum Source

Since: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

fmap :: (a -> b) -> Sum a -> Sum b Source

(<$) :: a -> Sum b -> Sum a Source

Functor ZipList Source

Since: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Functor.ZipList

Методы

fmap :: (a -> b) -> ZipList a -> ZipList b Source

(<$) :: a -> ZipList b -> ZipList a Source

Functor NoIO Source

Since: base-4.8.0.0

Подробности экземпляра

Определено в GHC.Internal.GHCi

Методы

fmap :: (a -> b) -> NoIO a -> NoIO b Source

(<$) :: a -> NoIO b -> NoIO a Source

Functor Par1 Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> Par1 a -> Par1 b Source

(<$) :: a -> Par1 b -> Par1 a Source

Functor Q Source
Подробности экземпляра

Определено в GHC.Internal.TH.Syntax

Методы

fmap :: (a -> b) -> Q a -> Q b Source

(<$) :: a -> Q b -> Q a Source

Functor TyVarBndr Source
Подробности экземпляра

Определено в GHC.Internal.TH.Syntax

Методы

fmap :: (a -> b) -> TyVarBndr a -> TyVarBndr b Source

(<$) :: a -> TyVarBndr b -> TyVarBndr a Source

Functor P Source

Since: base-4.8.0.0

Instance details

Defined in GHC.Internal.Text.ParserCombinators.ReadP

Methods

fmap :: (a -> b) -> P a -> P b Source

(<$) :: a -> P b -> P a Source

Functor ReadP Source

Since: base-2.1

Instance details

Defined in GHC.Internal.Text.ParserCombinators.ReadP

Methods

fmap :: (a -> b) -> ReadP a -> ReadP b Source

(<$) :: a -> ReadP b -> ReadP a Source

Functor ReadPrec Source

Since: base-2.1

Instance details

Defined in GHC.Internal.Text.ParserCombinators.ReadPrec

Methods

fmap :: (a -> b) -> ReadPrec a -> ReadPrec b Source

(<$) :: a -> ReadPrec b -> ReadPrec a Source

Functor IO Source

Since: base-2.1

Instance details

Defined in GHC.Internal.Base

Methods

fmap :: (a -> b) -> IO a -> IO b Source

(<$) :: a -> IO b -> IO a Source

Functor Maybe Source

Since: base-2.1

Instance details

Defined in GHC.Internal.Base

Methods

fmap :: (a -> b) -> Maybe a -> Maybe b Source

(<$) :: a -> Maybe b -> Maybe a Source

Functor Solo Source

Since: base-4.15

Instance details

Defined in GHC.Internal.Base

Methods

fmap :: (a -> b) -> Solo a -> Solo b Source

(<$) :: a -> Solo b -> Solo a Source

Functor [] Source

Since: base-2.1

Instance details

Defined in GHC.Internal.Base

Methods

fmap :: (a -> b) -> [a] -> [b] Source

(<$) :: a -> [b] -> [a] Source

Monad m => Functor (WrappedMonad m) Source

Since: base-2.1

Instance details

Defined in Control.Applicative

Methods

fmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Source

(<$) :: a -> WrappedMonad m b -> WrappedMonad m a Source

Functor (Arg a) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в Data.Semigroup

Методы

fmap :: (a0 -> b) -> Arg a a0 -> Arg a b Source

(<$) :: a0 -> Arg a b -> Arg a a0 Source

Functor (Array i) Source

Since: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Arr

Методы

fmap :: (a -> b) -> Array i a -> Array i b Source

(<$) :: a -> Array i b -> Array i a Source

Functor (ArrowMonad a) Source

Since: base-4.6.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Arrow

Методы

fmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Source

(<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Source

Functor (ST s) Source

Since: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Control.Monad.ST.Lazy.Imp

Методы

fmap :: (a -> b) -> ST s a -> ST s b Source

(<$) :: a -> ST s b -> ST s a Source

Functor (Either a) Source

Since: base-3.0

Подробности экземпляра

Определено в GHC.Internal.Data.Either

Методы

fmap :: (a0 -> b) -> Either a a0 -> Either a b Source

(<$) :: a0 -> Either a b -> Either a a0 Source

Functor (StateL s) Source

Since: base-4.0

Подробности экземпляра

Определено в GHC.Internal.Data.Functor.Utils

Методы

fmap :: (a -> b) -> StateL s a -> StateL s b Source

(<$) :: a -> StateL s b -> StateL s a Source

Functor (StateR s) Source

Since: base-4.0

Подробности экземпляра

Определено в GHC.Internal.Data.Functor.Utils

Краткое описание методов

fmap :: (a -> b) -> StateR s a -> StateR s b Источник

(<$) :: a -> StateR s b -> StateR s a Источник

Functor (Proxy :: Type -> Type) Источник

С версии: base-4.7.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Proxy

Краткое описание методов

fmap :: (a -> b) -> Proxy a -> Proxy b Источник

(<$) :: a -> Proxy b -> Proxy a Источник

Functor (U1 :: Type -> Type) Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Краткое описание методов

fmap :: (a -> b) -> U1 a -> U1 b Источник

(<$) :: a -> U1 b -> U1 a Источник

Functor (V1 :: Type -> Type) Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Краткое описание методов

fmap :: (a -> b) -> V1 a -> V1 b Источник

(<$) :: a -> V1 b -> V1 a Источник

Functor (ST s) Источник

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.ST

Краткое описание методов

fmap :: (a -> b) -> ST s a -> ST s b Источник

(<$) :: a -> ST s b -> ST s a Источник

Functor ((,) a) Источник

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Base

Краткое описание методов

fmap :: (a0 -> b) -> (a, a0) -> (a, b) Источник

(<$) :: a0 -> (a, b) -> (a, a0) Источник

Arrow a => Functor (WrappedArrow a b) Источник

С версии: base-2.1

Подробности экземпляра

Определено в Control.Applicative

Краткое описание методов

fmap :: (a0 -> b0) -> WrappedArrow a b a0 -> WrappedArrow a b b0 Источник

(<$) :: a0 -> WrappedArrow a b b0 -> WrappedArrow a b a0 Источник

Functor m => Functor (Kleisli m a) Источник

С версии: base-4.14.0.0

Информация о реализации

Определено в GHC.Internal.Control.Arrow

Методы

fmap :: (a0 -> b) -> Kleisli m a a0 -> Kleisli m a b Исходный код

(<$) :: a0 -> Kleisli m a b -> Kleisli m a a0 Исходный код

Functor (Const m :: Type -> Type) Исходный код

С версии: base-2.1

Информация о реализации

Определено в GHC.Internal.Data.Functor.Const

Методы

fmap :: (a -> b) -> Const m a -> Const m b Исходный код

(<$) :: a -> Const m b -> Const m a Исходный код

Monad m => Functor (StateT s m) Исходный код

С версии: base-4.18.0.0

Информация о реализации

Определено в GHC.Internal.Data.Functor.Utils

Методы

fmap :: (a -> b) -> StateT s m a -> StateT s m b Исходный код

(<$) :: a -> StateT s m b -> StateT s m a Исходный код

Functor f => Functor (Ap f) Исходный код

С версии: base-4.12.0.0

Информация о реализации

Определено в GHC.Internal.Data.Monoid

Методы

fmap :: (a -> b) -> Ap f a -> Ap f b Исходный код

(<$) :: a -> Ap f b -> Ap f a Исходный код

Functor f => Functor (Alt f) Исходный код

С версии: base-4.8.0.0

Информация о реализации

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

fmap :: (a -> b) -> Alt f a -> Alt f b Исходный код

(<$) :: a -> Alt f b -> Alt f a Исходный код

(Generic1 f, Functor (Rep1 f)) => Functor (Generically1 f) Исходный код

С версии: base-4.17.0.0

Информация о реализации

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> Generically1 f a -> Generically1 f b Исходный код

(<$) :: a -> Generically1 f b -> Generically1 f a Исходный код

Functor f => Functor (Rec1 f) Исходный код

С версии: base-4.9.0.0

Информация о реализации

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> Rec1 f a -> Rec1 f b Исходный код

(<$) :: a -> Rec1 f b -> Rec1 f a Исходный код

Functor (URec (Ptr ()) :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec (Ptr ()) a -> URec (Ptr ()) b Source

(<$) :: a -> URec (Ptr ()) b -> URec (Ptr ()) a Source

Functor (URec Char :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec Char a -> URec Char b Source

(<$) :: a -> URec Char b -> URec Char a Source

Functor (URec Double :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec Double a -> URec Double b Source

(<$) :: a -> URec Double b -> URec Double a Source

Functor (URec Float :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec Float a -> URec Float b Source

(<$) :: a -> URec Float b -> URec Float a Source

Functor (URec Int :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec Int a -> URec Int b Source

(<$) :: a -> URec Int b -> URec Int a Source

Functor (URec Word :: Type -> Type) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> URec Word a -> URec Word b Source

(<$) :: a -> URec Word b -> URec Word a Source

Functor ((,,) a b) Source

Since: base-4.14.0.0

Информация о экземпляре

Определено в GHC.Internal.Base

Методы

fmap :: (a0 -> b0) -> (a, b, a0) -> (a, b, b0) Исходный код

(<$) :: a0 -> (a, b, b0) -> (a, b, a0) Исходный код

(Functor f, Functor g) => Functor (Product f g) Исходный код

С версии: base-4.9.0.0

Информация о экземпляре

Определено в Data.Functor.Product

Методы

fmap :: (a -> b) -> Product f g a -> Product f g b Исходный код

(<$) :: a -> Product f g b -> Product f g a Исходный код

(Functor f, Functor g) => Functor (Sum f g) Исходный код

С версии: base-4.9.0.0

Информация о экземпляре

Определено в Data.Functor.Sum

Методы

fmap :: (a -> b) -> Sum f g a -> Sum f g b Исходный код

(<$) :: a -> Sum f g b -> Sum f g a Исходный код

(Functor f, Functor g) => Functor (f :*: g) Исходный код

С версии: base-4.9.0.0

Информация о экземпляре

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> (f :*: g) a -> (f :*: g) b Исходный код

(<$) :: a -> (f :*: g) b -> (f :*: g) a Исходный код

(Functor f, Functor g) => Functor (f :+: g) Исходный код

С версии: base-4.9.0.0

Информация о экземпляре

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> (f :+: g) a -> (f :+: g) b Исходный код

(<$) :: a -> (f :+: g) b -> (f :+: g) a Исходный код

Functor (K1 i c :: Type -> Type) Исходный код

С версии: base-4.9.0.0

Информация о экземпляре

Определено в GHC.Internal.Generics

Методы

fmap :: (a -> b) -> K1 i c a -> K1 i c b Исходный код

(<$) :: a -> K1 i c b -> K1 i c a Исходный код

Functor ((,,,) a b c) Исходный код

С версии: base-4.14.0.0

Информация о экземпляре

Определено в GHC.Internal.Base

Методы

fmap :: (a0 -> b0) -> (a, b, c, a0) -> (a, b, c, b0) Исходный код

(<$) :: a0 -> (a, b, c, b0) -> (a, b, c, a0) Исходный код

Functor ((->) r) Исходный код

С версии: base-2.1

Информация о экземпляре

Определено в GHC.Internal.Base

Методы

fmap :: (a -> b) -> (r -> a) -> r -> b Исходный код

(<$) :: a -> (r -> b) -> r -> a Исходный код

(Functor f, Functor g) => Functor (Compose f g) Source

Since: base-4.9.0.0

Instance details

Defined in Data.Functor.Compose

Методы

fmap :: (a -> b) -> Compose f g a -> Compose f g b Source

(<$) :: a -> Compose f g b -> Compose f g a Source

(Functor f, Functor g) => Functor (f :.: g) Source

Since: base-4.9.0.0

Instance details

Defined in GHC.Internal.Generics

Методы

fmap :: (a -> b) -> (f :.: g) a -> (f :.: g) b Source

(<$) :: a -> (f :.: g) b -> (f :.: g) a Source

Functor f => Functor (M1 i c f) Source

Since: base-4.9.0.0

Instance details

Defined in GHC.Internal.Generics

Методы

fmap :: (a -> b) -> M1 i c f a -> M1 i c f b Source

(<$) :: a -> M1 i c f b -> M1 i c f a Source

Functor ((,,,,) a b c d) Source

Since: base-4.18.0.0

Instance details

Defined in GHC.Internal.Base

Методы

fmap :: (a0 -> b0) -> (a, b, c, d, a0) -> (a, b, c, d, b0) Source

(<$) :: a0 -> (a, b, c, d, b0) -> (a, b, c, d, a0) Source

Functor ((,,,,,) a b c d e) Source

Since: base-4.18.0.0

Instance details

Defined in GHC.Internal.Base

Методы

fmap :: (a0 -> b0) -> (a, b, c, d, e, a0) -> (a, b, c, d, e, b0) Source

(<$) :: a0 -> (a, b, c, d, e, b0) -> (a, b, c, d, e, a0) Source

Functor ((,,,,,,) a b c d e f) Source

Since: base-4.18.0.0

Instance details

Defined in GHC.Internal.Base

Методы

fmap :: (a0 -> b0) -> (a, b, c, d, e, f, a0) -> (a, b, c, d, e, f, b0) Source

(<$) :: a0 -> (a, b, c, d, e, f, b0) -> (a, b, c, d, e, f, a0) Source

class Applicative m => Monad (m :: Type -> Type) where Source

Класс Monad определяет основные операции над монадой, концепцией из раздела математики, известного как теория категорий. Однако с точки зрения программиста Haskell, лучше всего рассматривать монаду как абстрактный тип данных действий. Выражения do в Haskell обеспечивают удобный синтаксис для записи монадических выражений.

Экземпляры Monad должны удовлетворять следующим условиям:

Левый тождество
return a >>= k = k a
Правый тождество
m >>= return = m
Ассоциативность
m >>= (\x -> k x >>= h) = (m >>= k) >>= h

Кроме того, операции Monad и Applicative должны быть связаны следующим образом:

  • pure = return
  • m1 <*> m2 = m1 >>= (\x1 -> m2 >>= (\x2 -> return (x1 x2)))

Вышеприведенные законы подразумевают:

  • fmap f xs  =  xs >>= return . f
  • (>>) = (*>)

и что pure и (<*>) удовлетворяют законам аппликативного функтора.

Экземпляры Monad для List, Maybe и IO, определенные в Prelude, удовлетворяют этим законам.

Минимальное полное определение

(>>=)

Методы

(>>=) :: m a -> (a -> m b) -> m b infixl 1 Source

Последовательно выполняет два действия, передавая любое значение, произведённое первым, в качестве аргумента второму.

'as >>= bs' можно понять как выражение do.

do a <- as
   bs a

Альтернативное название этой функции — 'bind', но некоторые могут называть её 'flatMap', так как она эквивалентна

\x f -> join (fmap f x) :: Monad m => m a -> (a -> m b) -> m b

что можно рассматривать как отображение значения с помощью Monad m => m a -> m (m b) и последующим «сглаживанием» m (m b) в m b с помощью join.

(>>) :: m a -> m b -> m b infixl 1 Source

Последовательно выполняет два действия, игнорируя любое значение, произведённое первым, как операторы последовательности (такие как точка с запятой) в императивных языках.

'as >> bs' можно понять как выражение do.

do as
   bs

или в терминах (>>=) как

as >>= const bs

return :: a -> m a Source

Вводит значение в монадический тип. Эта функция не должна отличаться от её реализации по умолчанию, как pure. Оправдание существования этой функции чисто историческое.

Экземпляры
Подробности об экземплярах
Monad Complex Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в Data.Complex

Методы

(>>=) :: Complex a -> (a -> Complex b) -> Complex b Источник

(>>) :: Complex a -> Complex b -> Complex b Источник

return :: a -> Complex a Источник

Monad First Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в Data.Semigroup

Методы

(>>=) :: First a -> (a -> First b) -> First b Источник

(>>) :: First a -> First b -> First b Источник

return :: a -> First a Источник

Monad Last Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в Data.Semigroup

Методы

(>>=) :: Last a -> (a -> Last b) -> Last b Источник

(>>) :: Last a -> Last b -> Last b Источник

return :: a -> Last a Источник

Monad Max Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в Data.Semigroup

Методы

(>>=) :: Max a -> (a -> Max b) -> Max b Источник

(>>) :: Max a -> Max b -> Max b Источник

return :: a -> Max a Источник

Monad Min Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в Data.Semigroup

Методы

(>>=) :: Min a -> (a -> Min b) -> Min b Источник

(>>) :: Min a -> Min b -> Min b Источник

return :: a -> Min a Источник

Monad NonEmpty Источник

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в GHC.Internal.Base

Методы

(>>=) :: NonEmpty a -> (a -> NonEmpty b) -> NonEmpty b Источник

(>>) :: NonEmpty a -> NonEmpty b -> NonEmpty b Источник

return :: a -> NonEmpty a Источник

Monad STM Источник

С версии: base-4.3.0.0

Подробности о реализации

Определено в GHC.Internal.Conc.Sync

Методы

(>>=) :: STM a -> (a -> STM b) -> STM b Исходный код

(>>) :: STM a -> STM b -> STM b Исходный код

return :: a -> STM a Исходный код

Monad Identity Исходный код

С версии: base-4.8.0.0

Подробности о реализации

Определено в GHC.Internal.Data.Functor.Identity

Методы

(>>=) :: Identity a -> (a -> Identity b) -> Identity b Исходный код

(>>) :: Identity a -> Identity b -> Identity b Исходный код

return :: a -> Identity a Исходный код

Monad First Исходный код

С версии: base-4.8.0.0

Подробности о реализации

Определено в GHC.Internal.Data.Monoid

Методы

(>>=) :: First a -> (a -> First b) -> First b Исходный код

(>>) :: First a -> First b -> First b Исходный код

return :: a -> First a Исходный код

Monad Last Исходный код

С версии: base-4.8.0.0

Подробности о реализации

Определено в GHC.Internal.Data.Monoid

Методы

(>>=) :: Last a -> (a -> Last b) -> Last b Исходный код

(>>) :: Last a -> Last b -> Last b Исходный код

return :: a -> Last a Исходный код

Monad Down Исходный код

С версии: base-4.11.0.0

Подробности о реализации

Определено в GHC.Internal.Data.Ord

Методы

(>>=) :: Down a -> (a -> Down b) -> Down b Исходный код

(>>) :: Down a -> Down b -> Down b Исходный код

return :: a -> Down a Исходный код

Monad Dual Исходный код

С версии: base-4.8.0.0

Подробности о реализации

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

(>>=) :: Dual a -> (a -> Dual b) -> Dual b Исходный код

(>>) :: Dual a -> Dual b -> Dual b Исходный код

return :: a -> Dual a Исходный код

Monad Product Исходный код

С версии: base-4.8.0.0

Детали экземпляра

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

(>>=) :: Product a -> (a -> Product b) -> Product b Исходный код

(>>) :: Product a -> Product b -> Product b Исходный код

return :: a -> Product a Исходный код

Monad Sum Исходный код

С момента: base-4.8.0.0

Детали экземпляра

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

(>>=) :: Sum a -> (a -> Sum b) -> Sum b Исходный код

(>>) :: Sum a -> Sum b -> Sum b Исходный код

return :: a -> Sum a Исходный код

Monad NoIO Исходный код

С момента: base-4.4.0.0

Детали экземпляра

Определено в GHC.Internal.GHCi

Методы

(>>=) :: NoIO a -> (a -> NoIO b) -> NoIO b Исходный код

(>>) :: NoIO a -> NoIO b -> NoIO b Исходный код

return :: a -> NoIO a Исходный код

Monad Par1 Исходный код

С момента: base-4.9.0.0

Детали экземпляра

Определено в GHC.Internal.Generics

Методы

(>>=) :: Par1 a -> (a -> Par1 b) -> Par1 b Исходный код

(>>) :: Par1 a -> Par1 b -> Par1 b Исходный код

return :: a -> Par1 a Исходный код

Monad Q Исходный код
Детали экземпляра

Определено в GHC.Internal.TH.Syntax

Методы

(>>=) :: Q a -> (a -> Q b) -> Q b Исходный код

(>>) :: Q a -> Q b -> Q b Исходный код

return :: a -> Q a Исходный код

Monad P Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

(>>=) :: P a -> (a -> P b) -> P b Исходный код

(>>) :: P a -> P b -> P b Исходный код

return :: a -> P a Исходный код

Monad ReadP Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

(>>=) :: ReadP a -> (a -> ReadP b) -> ReadP b Исходный код

(>>) :: ReadP a -> ReadP b -> ReadP b Исходный код

return :: a -> ReadP a Исходный код

Monad ReadPrec Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadPrec

Методы

(>>=) :: ReadPrec a -> (a -> ReadPrec b) -> ReadPrec b Исходный код

(>>) :: ReadPrec a -> ReadPrec b -> ReadPrec b Исходный код

return :: a -> ReadPrec a Исходный код

Monad IO Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: IO a -> (a -> IO b) -> IO b Исходный код

(>>) :: IO a -> IO b -> IO b Исходный код

return :: a -> IO a Исходный код

Monad Maybe Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b Исходный код

(>>) :: Maybe a -> Maybe b -> Maybe b Исходный код

return :: a -> Maybe a Исходный код

Monad Solo Исходный код

С момента: base-4.15

Детали экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: Solo a -> (a -> Solo b) -> Solo b Исходный код

(>>) :: Solo a -> Solo b -> Solo b Исходный код

return :: a -> Solo a Исходный код

Monad [] Исходный код

С момента: base-2.1

Детали экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: [a] -> (a -> [b]) -> [b] Исходный код

(>>) :: [a] -> [b] -> [b] Исходный код

return :: a -> [a] Исходный код

Monad m => Monad (WrappedMonad m) Исходный код

С момента: base-4.7.0.0

Подробности экземпляра

Определено в Control.Applicative

Методы

(>>=) :: WrappedMonad m a -> (a -> WrappedMonad m b) -> WrappedMonad m b Исходный код

(>>) :: WrappedMonad m a -> WrappedMonad m b -> WrappedMonad m b Исходный код

return :: a -> WrappedMonad m a Исходный код

ArrowApply a => Monad (ArrowMonad a) Исходный код

С момента: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Control.Arrow

Методы

(>>=) :: ArrowMonad a a0 -> (a0 -> ArrowMonad a b) -> ArrowMonad a b Исходный код

(>>) :: ArrowMonad a a0 -> ArrowMonad a b -> ArrowMonad a b Исходный код

return :: a0 -> ArrowMonad a a0 Исходный код

Monad (ST s) Исходный код

С момента: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Control.Monad.ST.Lazy.Imp

Методы

(>>=) :: ST s a -> (a -> ST s b) -> ST s b Исходный код

(>>) :: ST s a -> ST s b -> ST s b Исходный код

return :: a -> ST s a Исходный код

Monad (Either e) Исходный код

С момента: base-4.4.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Either

Методы

(>>=) :: Either e a -> (a -> Either e b) -> Either e b Исходный код

(>>) :: Either e a -> Either e b -> Either e b Исходный код

return :: a -> Either e a Исходный код

Monad (Proxy :: Type -> Type) Исходный код

С момента: base-4.7.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Proxy

Методы

(>>=) :: Proxy a -> (a -> Proxy b) -> Proxy b Исходный код

(>>) :: Proxy a -> Proxy b -> Proxy b Исходный код

return :: a -> Proxy a Исходный код

Monad (U1 :: Type -> Type) Исходный код

С момента: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

(>>=) :: U1 a -> (a -> U1 b) -> U1 b Исходный код

(>>) :: U1 a -> U1 b -> U1 b Исходный код

return :: a -> U1 a Исходный код

Монад (ST s) Источник

С момента: base-2.1

Подробности экземпляра

Определено в GHC.Internal.ST

Методы

(>>=) :: ST s a -> (a -> ST s b) -> ST s b Источник

(>>) :: ST s a -> ST s b -> ST s b Источник

return :: a -> ST s a Источник

Моноид a => Монад ((,) a) Источник

С момента: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: (a, a0) -> (a0 -> (a, b)) -> (a, b) Источник

(>>) :: (a, a0) -> (a, b) -> (a, b) Источник

return :: a0 -> (a, a0) Источник

Монад m => Монад (Kleisli m a) Источник

С момента: base-4.14.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Arrow

Методы

(>>=) :: Kleisli m a a0 -> (a0 -> Kleisli m a b) -> Kleisli m a b Источник

(>>) :: Kleisli m a a0 -> Kleisli m a b -> Kleisli m a b Источник

return :: a0 -> Kleisli m a a0 Источник

Монад m => Монад (StateT s m) Источник

С момента: base-4.18.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Functor.Utils

Методы

(>>=) :: StateT s m a -> (a -> StateT s m b) -> StateT s m b Источник

(>>) :: StateT s m a -> StateT s m b -> StateT s m b Источник

return :: a -> StateT s m a Источник

Монад f => Монад (Ap f) Источник

С момента: base-4.12.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Monoid

Методы

(>>=) :: Ap f a -> (a -> Ap f b) -> Ap f b Источник

(>>) :: Ap f a -> Ap f b -> Ap f b Источник

return :: a -> Ap f a Источник

Монад f => Монад (Alt f) Источник

С момента: base-4.8.0.0

Информация об экземпляре

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

(>>=) :: Alt f a -> (a -> Alt f b) -> Alt f b Исходный код

(>>) :: Alt f a -> Alt f b -> Alt f b Исходный код

return :: a -> Alt f a Исходный код

Monad f => Monad (Rec1 f) Исходный код

С версии: base-4.9.0.0

Информация об экземпляре

Определено в GHC.Internal.Generics

Методы

(>>=) :: Rec1 f a -> (a -> Rec1 f b) -> Rec1 f b Исходный код

(>>) :: Rec1 f a -> Rec1 f b -> Rec1 f b Исходный код

return :: a -> Rec1 f a Исходный код

(Monoid a, Monoid b) => Monad ((,,) a b) Исходный код

С версии: base-4.14.0.0

Информация об экземпляре

Определено в GHC.Internal.Base

Методы

(>>=) :: (a, b, a0) -> (a0 -> (a, b, b0)) -> (a, b, b0) Исходный код

(>>) :: (a, b, a0) -> (a, b, b0) -> (a, b, b0) Исходный код

return :: a0 -> (a, b, a0) Исходный код

(Monad f, Monad g) => Monad (Product f g) Исходный код

С версии: base-4.9.0.0

Информация об экземпляре

Определено в Data.Functor.Product

Методы

(>>=) :: Product f g a -> (a -> Product f g b) -> Product f g b Исходный код

(>>) :: Product f g a -> Product f g b -> Product f g b Исходный код

return :: a -> Product f g a Исходный код

(Monad f, Monad g) => Monad (f :*: g) Исходный код

С версии: base-4.9.0.0

Информация об экземпляре

Определено в GHC.Internal.Generics

Методы

(>>=) :: (f :*: g) a -> (a -> (f :*: g) b) -> (f :*: g) b Исходный код

(>>) :: (f :*: g) a -> (f :*: g) b -> (f :*: g) b Исходный код

return :: a -> (f :*: g) a Исходный код

(Monoid a, Monoid b, Monoid c) => Monad ((,,,) a b c) Исходный код

С версии: base-4.14.0.0

Информация об экземпляре

Определено в GHC.Internal.Base

Методы

(>>=) :: (a, b, c, a0) -> (a0 -> (a, b, c, b0)) -> (a, b, c, b0) Исходный код

(>>) :: (a, b, c, a0) -> (a, b, c, b0) -> (a, b, c, b0) Исходный код

return :: a0 -> (a, b, c, a0) Исходный код

Monad ((->) r) Исходный код

С версии: base-2.1

Подробности экземпляра

Определено в GHC.Internal.Base

Методы

(>>=) :: (r -> a) -> (a -> r -> b) -> r -> b Исходный код

(>>) :: (r -> a) -> (r -> b) -> r -> b Исходный код

return :: a -> r -> a Исходный код

Monad f => Monad (M1 i c f) Исходный код

С момента: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

(>>=) :: M1 i c f a -> (a -> M1 i c f b) -> M1 i c f b Исходный код

(>>) :: M1 i c f a -> M1 i c f b -> M1 i c f b Исходный код

return :: a -> M1 i c f a Исходный код

class Monad m => MonadFail (m :: Type -> Type) where Исходный код

Когда значение связывается в do-нотации, шаблон слева от <- может не совпадать. В этом случае этот класс предоставляет функцию восстановления.

Monad без экземпляра MonadFail может использоваться только совместно с шаблоном, который всегда совпадает, например, с newtype, кортежами, типами данных с одним конструктором данных и неуничтожимыми шаблонами (~pat).

Экземпляры MonadFail должны удовлетворять следующему закону: fail s должно быть левым нулем для >>=,

fail s >>= f  =  fail s

Если ваш Monad также является MonadPlus, популярное определение —

fail _ = mzero

fail s должно быть действием, выполняющимся в самом монаде, а не исключением (за исключением экземпляров MonadIO). В частности, fail не должно реализовываться с помощью error.

С момента: base-4.9.0.0

Методы

fail :: String -> m a Исходный код

Экземпляры
Подробности экземпляров
MonadFail Q Источник
Подробности экземпляра

Определено в GHC.Internal.TH.Syntax

Методы

fail :: String -> Q a Источник

MonadFail P Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

fail :: String -> P a Источник

MonadFail ReadP Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

fail :: String -> ReadP a Источник

MonadFail ReadPrec Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Text.ParserCombinators.ReadPrec

Методы

fail :: String -> ReadPrec a Источник

MonadFail IO Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Monad.Fail

Методы

fail :: String -> IO a Источник

MonadFail Maybe Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Monad.Fail

Методы

fail :: String -> Maybe a Источник

MonadFail [] Источник

С версии: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Control.Monad.Fail

Методы

fail :: String -> [a] Источник

MonadFail f => MonadFail (Ap f) Источник

С версии: base-4.12.0.0

Подробности экземпляра

Определено в GHC.Internal.Data.Monoid

Методы

fail :: String -> Ap f a Источник

class (Alternative m, Monad m) => MonadPlus (m :: Type -> Type) where Source

Моноиды, которые также поддерживают выбор и неудачу.

Минимальное полное определение

Nothing

Методы

mzero :: m a Source

Тождество mplus. Он также должен удовлетворять уравнениям

mzero >>= f  =  mzero
v >> mzero   =  mzero

Определение по умолчанию:

mzero = empty

mplus :: m a -> m a -> m a Source

Ассоциативная операция. Определение по умолчанию:

mplus = (<|>)
Экземпляры
Подробности об экземплярах
MonadPlus STM Источник

Берёт первое не-retryщее STM действие.

С версии: base-4.3.0.0

Подробности об экземпляре

Определено в GHC.Internal.Conc.Sync

Методы

mzero :: STM a Источник

mplus :: STM a -> STM a -> STM a Источник

MonadPlus P Источник

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

mzero :: P a Источник

mplus :: P a -> P a -> P a Источник

MonadPlus ReadP Источник

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Internal.Text.ParserCombinators.ReadP

Методы

mzero :: ReadP a Источник

mplus :: ReadP a -> ReadP a -> ReadP a Источник

MonadPlus ReadPrec Источник

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Internal.Text.ParserCombinators.ReadPrec

Методы

mzero :: ReadPrec a Источник

mplus :: ReadPrec a -> ReadPrec a -> ReadPrec a Источник

MonadPlus IO Источник

Берёт результат первого не-выбрасывающего IO действия. mzero выбрасывает исключение.

С версии: base-4.9.0.0

Подробности об экземпляре

Определено в GHC.Internal.Base

Методы

mzero :: IO a Источник

mplus :: IO a -> IO a -> IO a Источник

MonadPlus Maybe Источник

Выбирает самое левое Just значение, или, альтернативно, Nothing.

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Internal.Base

Методы

mzero :: Maybe a Источник

mplus :: Maybe a -> Maybe a -> Maybe a Источник

MonadPlus [] Источник

Объединяет списки конкатенацией, начиная с пустого списка.

С версии: base-2.1

Подробности об экземпляре

Определено в GHC.Internal.Base

Методы

mzero :: [a] Источник

mplus :: [a] -> [a] -> [a] Источник

(ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) Источник

С версии: base-4.6.0.0

Instance details

Определено в GHC.Internal.Control.Arrow

Методы

mzero :: ArrowMonad a a0 Source

mplus :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Source

MonadPlus (Proxy :: Type -> Type) Source

Since: base-4.9.0.0

Instance details

Определено в GHC.Internal.Data.Proxy

Методы

mzero :: Proxy a Source

mplus :: Proxy a -> Proxy a -> Proxy a Source

MonadPlus (U1 :: Type -> Type) Source

Since: base-4.9.0.0

Instance details

Определено в GHC.Internal.Generics

Методы

mzero :: U1 a Source

mplus :: U1 a -> U1 a -> U1 a Source

MonadPlus m => MonadPlus (Kleisli m a) Source

Since: base-4.14.0.0

Instance details

Определено в GHC.Internal.Control.Arrow

Методы

mzero :: Kleisli m a a0 Source

mplus :: Kleisli m a a0 -> Kleisli m a a0 -> Kleisli m a a0 Source

MonadPlus f => MonadPlus (Ap f) Source

Since: base-4.12.0.0

Instance details

Определено в GHC.Internal.Data.Monoid

Методы

mzero :: Ap f a Source

mplus :: Ap f a -> Ap f a -> Ap f a Source

MonadPlus f => MonadPlus (Alt f) Source

Since: base-4.8.0.0

Instance details

Определено в GHC.Internal.Data.Semigroup.Internal

Методы

mzero :: Alt f a Source

mplus :: Alt f a -> Alt f a -> Alt f a Source

MonadPlus f => MonadPlus (Rec1 f) Source

Since: base-4.9.0.0

Instance details

Определено в GHC.Internal.Generics

Методы

mzero :: Rec1 f a Source

mplus :: Rec1 f a -> Rec1 f a -> Rec1 f a Source

(MonadPlus f, MonadPlus g) => MonadPlus (Product f g) Source

Since: base-4.9.0.0

Подробности экземпляра

Определено в Data.Functor.Product

Методы

mzero :: Product f g a Источник

mplus :: Product f g a -> Product f g a -> Product f g a Источник

(MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) Источник

С момента: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

mzero :: (f :*: g) a Источник

mplus :: (f :*: g) a -> (f :*: g) a -> (f :*: g) a Источник

MonadPlus f => MonadPlus (M1 i c f) Источник

С момента: base-4.9.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

Методы

mzero :: M1 i c f a Источник

mplus :: M1 i c f a -> M1 i c f a -> M1 i c f a Источник

Функции

Правила именования

Функции в этом модуле используют следующие правила именования:

  • Суффикс 'M' всегда обозначает функцию в категории Kleisli: конструктор типа монады m добавляется к результатам функции (с учётом каррирования) и нигде больше.
filter  ::              (a ->   Bool) -> [a] ->   [a]
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
  • Суффикс '_' изменяет тип результата с (m a) на (m ()). Таким образом, например:
sequence  :: Monad m => [m a] -> m [a]
sequence_ :: Monad m => [m a] -> m ()
  • Префикс 'm' обобщает существующую функцию до монадической формы. Например:
filter  ::                (a -> Bool) -> [a] -> [a]
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) Источник

Применяет монадическое действие к каждому элементу структуры, вычисляет эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. mapM_.

Примеры
Развернуть

mapM — это буквально traverse с типом, ограниченным Monad. Его реализация может быть более эффективной благодаря дополнительным возможностям Monad.

mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () Источник

Применяет монадическое действие к каждому элементу структуры, вычисляет их слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. mapM.

mapM_ — это то же самое, что и traverse_, но специализировано для монадических действий.

forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) Источник

forM — это mapM с переставленными аргументами. Для версии, которая игнорирует результаты, см. forM_.

forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m () Источник

forM_ — это mapM_ с переставленными аргументами. Для версии, которая не игнорирует результаты, см. forM.

forM_ — это то же самое, что и for_, но специализировано для монадических действий.

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) Источник

Вычисляет каждое монадическое действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequence_.

Примеры
Развернуть

Основное использование:

Два первых примера — это случаи, когда входные и выходные данные sequence изоморфны.

>>> sequence $ Right [1,2,3,4]
[Right 1,Right 2,Right 3,Right 4]
>>> sequence $ [Right 1,Right 2,Right 3,Right 4]
Right [1,2,3,4]

Следующие примеры демонстрируют поведение короткого замыкания для sequence.

>>> sequence $ Left [1,2,3,4]
Left [1,2,3,4]
>>> sequence $ [Left 0, Right 1,Right 2,Right 3,Right 4]
Left 0

sequence_ :: (Foldable t, Monad m) => t (m a) -> m () Источник

Вычисляет каждое монадическое действие в структуре слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. sequence.

sequence_ — это то же самое, что и sequenceA_, но специализировано для монадических действий.

(=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 Источник

То же самое, что и >>=, но с переставленными аргументами.

as >>= f == f =<< as

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c infixr 1 Источник

Слева-направо композиция стрелок Kleisli.

'(bs >=> cs) a' можно понять как выражение do

do b <- bs a
   cs b

или в терминах (>>=) как

bs a >>= cs

(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c infixr 1 Источник

Справа-налево композиция стрелок Kleisli. (>=>), с переставленными аргументами.

Обратите внимание, как этот оператор напоминает композицию функций (.):

(.)   ::            (b ->   c) -> (a ->   b) -> a ->   c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c

forever :: Applicative f => f a -> f b Source

Повторять действие бесконечно.

Примеры
Развернуть

Распространённое применение forever — обработка входных данных из сетевых сокетов, Handle и каналов (например, MVar и Chan).

Например, вот как мы можем реализовать эхо-сервер, используя forever для прослушивания клиентских подключений по сетевому сокету и для эха клиентского ввода по дескрипторам подключений клиентов:

echoServer :: Socket -> IO ()
echoServer socket = forever $ do
  client <- accept socket
  forkFinally (echo client) (\_ -> hClose client)
  where
    echo :: Handle -> IO ()
    echo client = forever $
      hGetLine client >>= hPutStrLn client

Обратите внимание, что «forever» не обязательно приводит к нетерминируемому выполнению. Если действие находится в MonadPlus и прерывается после некоторого числа итераций, тогда forever фактически возвращает mzero, эффективно прерывая вызов своего родителя.

void :: Functor f => f a -> f () Source

void value игнорирует результат вычисления, например, возвращаемое значение действия IO.

Примеры
Развернуть

Заменить содержимое Maybe Int на unit:

>>> void Nothing
Nothing
>>> void (Just 3)
Just ()

Заменить содержимое Either Int Int на unit, получив в результате Either Int ():

>>> void (Left 8675309)
Left 8675309
>>> void (Right 8675309)
Right ()

Заменить каждый элемент списка на unit:

>>> void [1,2,3]
[(),(),()]

Заменить второй элемент пары на unit:

>>> void (1,2)
(1,())

Игнорировать результат действия IO:

>>> mapM print [1,2]
1
2
[(),()]
>>> void $ mapM print [1,2]
1
2

Обобщения функций над списками

join :: Monad m => m (m a) -> m a Source

Функция join — стандартный оператор объединения монады. Она используется для удаления одного уровня монадической структуры, проектируя её связанный аргумент на внешний уровень.

'join bss' может быть понято как выражение do

do bs <- bss
   bs
Примеры
Развернуть
>>> join [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1,2,3,4,5,6,7,8,9]
>>> join (Just (Just 3))
Just 3

Распространённое применение join — запуск вычисления IO, возвращённого транзакцией STM , так как транзакции STM не могут выполнять IO напрямую. Вспомним, что

atomically :: STM a -> IO a

используется для выполнения транзакций STM атомарно. Таким образом, специализируя типы atomically и join до

atomically :: STM (IO b) -> IO (IO b)
join       :: IO (IO b)  -> IO b

мы можем их комбинировать как

join . atomically :: STM (IO b) -> IO b

для запуска транзакции STM и действия IO , которое она возвращает.

msum :: (Foldable t, MonadPlus m) => t (m a) -> m a Source

Сумма коллекции действий, использующая (<|>), обобщающая concat.

msum аналогично asum, но специализирована на MonadPlus.

Примеры
Развернуть

Базовое использование, используя экземпляр MonadPlus для Maybe:

>>> msum [Just "Hello", Nothing, Just "World"]
Just "Hello"

mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a Source

Прямой аналог MonadPlus для filter.

Примеры
Развернуть

Функция filter — это просто mfilter , специализированная для монады списков:

filter = ( mfilter :: (a -> Bool) -> [a] -> [a] )

Пример использования mfilter с монадой Maybe:

>>> mfilter odd (Just 1)
Just 1
>>> mfilter odd (Just 2)
Nothing

filterM :: Applicative m => (a -> m Bool) -> [a] -> m [a] Source

Это обобщает функцию filter для списков.

runIdentity (filterM (Identity . p) xs) == filter p xs
Примеры
Развернуть
>>> filterM (\x -> do
      putStrLn ("Keep: " ++ show x ++ "?")
      answer <- getLine
      pure (answer == "y"))
    [1, 2, 3]
Keep: 1?
y
Keep: 2?
n
Keep: 3?
y
[1,3]
>>> filterM (\x -> do
      putStr (show x)
      x' <- readLn
      pure (x == x'))
    [1, 2, 3]
12
22
33
[2,3]

mapAndUnzipM :: Applicative m => (a -> m (b, c)) -> [a] -> m ([b], [c]) Source

Функция mapAndUnzipM применяет свой первый аргумент к списку, возвращая результат как пару списков. Эта функция в основном используется с сложными структурами данных или монадой состояния.

zipWithM :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m [c] Source

Функция zipWithM обобщает zipWith на произвольные аппликативные функторы.

zipWithM_ :: Applicative m => (a -> b -> m c) -> [a] -> [b] -> m () Source

zipWithM_ — это расширение zipWithM , которое игнорирует окончательный результат.

foldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b Source

Функция foldM аналогична foldl, за исключением того, что её результат заключён в монаду. Обратите внимание, что foldM работает слева направо по списку аргументов. Это может быть проблемой, если (>>) и «функция складывания» не коммутативны.

foldM f a1 [x1, x2, ..., xm]

==

do
  a2 <- f a1 x1
  a3 <- f a2 x2
  ...
  f am xm

Если требуется вычисление справа налево, входной список нужно перевернуть.

Примечание: foldM равно foldlM

foldM_ :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m () Source

Подобно foldM, но результат игнорируется.

replicateM :: Applicative m => Int -> m a -> m [a] Source

replicateM n act выполняет действие act n раз, а затем возвращает список результатов.

replicateM n (pure x) == replicate n x
Примеры
Развернуть
>>> replicateM 3 getLine
hi
heya
hiya
["hi","heya","hiya"]
>>> import Control.Monad.State
>>> runState (replicateM 3 $ state $ \s -> (s, s + 1)) 1
([1,2,3],4)

replicateM_ :: Applicative m => Int -> m a -> m () Source

Подобно replicateM, но результат игнорируется.

Примеры
Развернуть
>>> replicateM_ 3 (putStr "a")
aaa

Условное выполнение монадических выражений

guard :: Alternative f => Bool -> f () Source

Условное прерывание вычислений Alternative. Определяется как

guard True  = pure ()
guard False = empty
Примеры
Развернуть

Общее использование guard включает условное сигнализирование об ошибке в монаде ошибок и условный отказ от текущего выбора в парсере, основанном на Alternative.

В качестве примера сигнализации об ошибке в монаде ошибок Maybe, рассмотрим функцию безопасного деления safeDiv x y, которая возвращает Nothing, когда знаменатель y равен нулю, и Just (x `div` y) в противном случае. Например:

>>> safeDiv 4 0
Nothing
>>> safeDiv 4 2
Just 2

Определение safeDiv с использованием охранных условий, но без guard.

safeDiv :: Int -> Int -> Maybe Int
safeDiv x y | y /= 0    = Just (x `div` y)
            | otherwise = Nothing

Определение safeDiv с использованием guard и Monad do-нотации:

safeDiv :: Int -> Int -> Maybe Int
safeDiv x y = do
  guard (y /= 0)
  return (x `div` y)

when :: Applicative f => Bool -> f () -> f () Исходный код

Условное выполнение Applicative выражений. Например,

Примеры
Развернуть
when debug (putStrLn "Debugging")

выведет строку Debugging, если булево значение debug равно True, и в противном случае ничего не сделает.

>>> putStr "pi:" >> when False (print 3.14159)
pi:

unless :: Applicative f => Bool -> f () -> f () Исходный код

Обратное when.

Примеры
Развернуть
>>> do x <- getLine
       unless (x == "hi") (putStrLn "hi!")
comingupwithexamplesisdifficult
hi!
>>> unless (pi > exp 1) Nothing
Just ()

Операторы монодического подъёма

liftM :: Monad m => (a1 -> r) -> m a1 -> m r Исходный код

Поднятие функции в монаду. Это эквивалентно fmap, но специализировано для монад.

liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r Исходный код

Поднять функцию в монаду, сканируя монодические аргументы слева направо.

Примеры
Развернуть
>>> liftM2 (+) [0,1] [0,2]
[0,2,1,3]
>>> liftM2 (+) (Just 1) Nothing
Nothing
>>> liftM2 (+) (+ 3) (* 2) 5
18

liftM3 :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r Исходный код

Поднятие функции в монаду, сканируя монодические аргументы слева направо (см. liftM2).

liftM4 :: Monad m => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r Исходный код

Поднять функцию в монаду, сканируя монодические аргументы слева направо (см. liftM2).

liftM5 :: Monad m => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r Исходный код

Поднять функцию в монаду, сканируя монодические аргументы слева направо (см. liftM2).

ap :: Monad m => m (a -> b) -> m a -> m b Исходный код

Во многих случаях операции liftM могут быть заменены использованием ap, что способствует применению функций.

return f `ap` x1 `ap` ... `ap` xn

эквивалентно

liftM<n> f x1 x2 ... xn
Примеры
Развернуть
>>> pure (\x y z -> x + y * z) `ap` Just 1 `ap` Just 5 `ap` Just 10
Just 51

Строгие монодические функции

(<$!>) :: Monad m => (a -> b) -> m a -> m b infixl 4 Исходный код

Строгая версия <$>.

С момента: base-4.8.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/Control-Monad.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API