Control.Monad
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | предварительная |
| Переносимость | переносимый |
| Безопасный Haskell | Надёжный |
| Язык | Haskell2010 |
Классы Functor и monad
class Functor f where Источник
Тип f является Functor, если он предоставляет функцию fmap, которая, учитывая любые типы a и b, позволяет применить любую функцию из (a -> b) для преобразования f a в f b, сохраняя структуру f. Кроме того, f должен соответствовать следующим условиям:
Обратите внимание, что второе правило вытекает из свободной теоремы типа fmap и первого правила, поэтому вам нужно только проверить соблюдение первого условия.
Минимальное полное определение
Методы
fmap :: (a -> b) -> f a -> f b Источник
Используя ApplicativeDo: 'fmap f as' можно понять как выражение do
do a <- as pure (f a)
с выведенным ограничением Functor.
(<$) :: a -> f b -> f a infixl 4 Источник
Заменяет все места в вводе одним и тем же значением. По умолчанию определение равно fmap . const, но может быть переопределено более эффективной версией.
Используя ApplicativeDo: 'a <$ bs' можно понять как выражение do
do bs pure a
с выведенным ограничением Functor.
Экземпляры
| Functor [] | Since: base-2.1 |
| Functor Maybe | Since: base-2.1 |
| Functor IO | Since: base-2.1 |
| Functor Par1 | Since: base-4.9.0.0 |
| Functor NonEmpty | Since: base-4.9.0.0 |
| Functor NoIO | Since: base-4.8.0.0 |
| Functor ReadP | Since: base-2.1 |
| Functor ReadPrec | Since: base-2.1 |
| Functor Down | Since: base-4.11.0.0 |
| Functor Product | Since: base-4.8.0.0 |
Определено в Data.Semigroup.Internal Методыfmap :: (a -> b) -> Product a -> Product b Исходный код (<$) :: a -> Product b -> Product a Исходный код | |
| Functor Sum | С момента: base-4.8.0.0 |
Определено в Data.Semigroup.Internal | |
| Functor Dual | С момента: base-4.8.0.0 |
Определено в Data.Semigroup.Internal | |
| Functor Last | С момента: base-4.8.0.0 |
Определено в Data.Monoid | |
| Functor First | С момента: base-4.8.0.0 |
Определено в Data.Monoid Методыfmap :: (a -> b) -> First a -> First b Исходный код (<$) :: a -> First b -> First a Исходный код | |
| Functor STM | С момента: base-4.3.0.0 |
Определено в GHC.Conc.Sync | |
| Functor Handler | С момента: base-4.6.0.0 |
Определено в Control.Exception Методыfmap :: (a -> b) -> Handler a -> Handler b Исходный код (<$) :: a -> Handler b -> Handler a Исходный код | |
| Functor Identity | С момента: base-4.8.0.0 |
Определено в Data.Functor.Identity Методыfmap :: (a -> b) -> Identity a -> Identity b Исходный код (<$) :: a -> Identity b -> Identity a Исходный код | |
| Functor ZipList | С момента: base-2.1 |
Определено в Control.Applicative Методыfmap :: (a -> b) -> ZipList a -> ZipList b Исходный код (<$) :: a -> ZipList b -> ZipList a Исходный код | |
| Functor ArgDescr | С момента: base-4.6.0.0 |
| Functor OptDescr | Since: base-4.6.0.0 |
| Functor ArgOrder | Since: base-4.6.0.0 |
| Functor Option | Since: base-4.9.0.0 |
| Functor Last | Since: base-4.9.0.0 |
| Functor First | Since: base-4.9.0.0 |
| Functor Max | Since: base-4.9.0.0 |
| Functor Min | Since: base-4.9.0.0 |
| Functor Complex | Since: base-4.9.0.0 |
| Functor (Either a) | Since: base-3.0 |
| Functor (V1 :: Type -> Type) | С: base-4.9.0.0 |
| Functor (U1 :: Type -> Type) | С: base-4.9.0.0 |
| Functor ((,) a) | С: base-2.1 |
| Functor (ST s) | С: base-2.1 |
| Functor (Array i) | С: base-2.1 |
| Functor (Proxy :: Type -> Type) | С: base-4.7.0.0 |
| Arrow a => Functor (ArrowMonad a) | С: base-4.6.0.0 |
Определено в Control.Arrow Методыfmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Источник (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Источник | |
| Monad m => Functor (WrappedMonad m) | С: base-2.1 |
Определено в Control.Applicative Методыfmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Источник (<$) :: a -> WrappedMonad m b -> WrappedMonad m a Источник | |
| Functor (ST s) | С: base-2.1 |
| Functor (Arg a) | С версии: base-4.9.0.0 |
| Functor f => Functor (Rec1 f) | С версии: base-4.9.0.0 |
| Functor (URec Char :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor (URec Double :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor (URec Float :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor (URec Int :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor (URec Word :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor (URec (Ptr ()) :: Type -> Type) | С версии: base-4.9.0.0 |
| Functor ((,,) a b) | С версии: base-4.14.0.0 |
| Functor f => Functor (Alt f) | С версии: base-4.8.0.0 |
| Functor f => Functor (Ap f) | С версии: base-4.12.0.0 |
| Functor (Const m :: Type -> Type) | С версии: base-2.1 |
| Functor m => Functor (Kleisli m a) | С версии: base-4.14.0.0 |
| 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 ((->) r :: Type -> Type) | С версии: base-2.1 |
| Functor (K1 i c :: Type -> Type) | С версии: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (f :+: g) | С версии: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (f :*: g) | С момента: base-4.9.0.0 |
| Functor ((,,,) a b c) | С момента: base-4.14.0.0 |
| (Functor f, Functor g) => Functor (Sum f g) | С момента: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (Product f g) | С момента: base-4.9.0.0 |
| Functor f => Functor (M1 i c f) | С момента: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (f :.: g) | С момента: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (Compose f g) | С момента: base-4.9.0.0 |
class Applicative m => Monad m where Источник
Класс Monad определяет основные операции над монадой, концепцией из области математики, известной как теория категорий. Однако с точки зрения программиста Haskell лучше всего представлять монаду как абстрактный тип данных действий. do выражения Haskell предоставляют удобную синтаксическую конструкцию для записи монадических выражений.
Экземпляры Monad должны удовлетворять следующим условиям:
- Левое тождество
return a >>= k = k a- Правое тождество
m >>= return = m- Ассоциативность
m >>= (\x -> k x >>= h) = (m >>= k) >>= h
Кроме того, операции Monad и Applicative должны быть связаны следующим образом:
Вышеуказанные законы подразумевают:
и что pure и (<*>) удовлетворяют законам аппликативного функтора.
Примеры Monad для списков, Maybe и IO , определённых в Prelude, удовлетворяют этим законам.
Минимальное полное определение
Методы
(>>=) :: forall a b. m a -> (a -> m b) -> m b infixl 1 Исходный код
Последовательно выполняет два действия, передавая любое значение, произведённое первым действием, в качестве аргумента второму.
'as >>= bs' можно понимать как выражение do
do a <- as bs a
(>>) :: forall a b. m a -> m b -> m b infixl 1 Исходный код
Последовательно выполняет два действия, отбрасывая любое значение, произведённое первым, как операторы последовательности (например, точка с запятой) в императивных языках.
'as >> bs' можно понимать как выражение do
do as bs
return :: a -> m a Исходный код
Вставляет значение в моноидальный тип.
Экземпляры
| Monad [] | С версии: base-2.1 |
Определено в GHC.Base Методы(>>=) :: [a] -> (a -> [b]) -> [b] Исходный код (>>) :: [a] -> [b] -> [b] Исходный код return :: a -> [a] Исходный код | |
| Monad Maybe | С версии: base-2.1 |
Определено в GHC.Base Методы(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b Исходный код (>>) :: Maybe a -> Maybe b -> Maybe b Исходный код return :: a -> Maybe a Исходный код | |
| Monad IO | С версии: base-2.1 |
Определено в GHC.Base Методы(>>=) :: IO a -> (a -> IO b) -> IO b Исходный код (>>) :: IO a -> IO b -> IO b Исходный код return :: a -> IO a Исходный код | |
| Monad Par1 | С версии: base-4.9.0.0 |
Определено в GHC.Generics Методы(>>=) :: Par1 a -> (a -> Par1 b) -> Par1 b Исходный код (>>) :: Par1 a -> Par1 b -> Par1 b Исходный код return :: a -> Par1 a Исходный код | |
| Monad NonEmpty | С версии: base-4.9.0.0 |
Определено в GHC.Base Методы(>>=) :: NonEmpty a -> (a -> NonEmpty b) -> NonEmpty b Исходный код (>>) :: NonEmpty a -> NonEmpty b -> NonEmpty b Исходный код return :: a -> NonEmpty a Исходный код | |
| Monad NoIO | С версии: base-4.4.0.0 |
Определено в GHC.GHCi Методы(>>=) :: NoIO a -> (a -> NoIO b) -> NoIO b Исходный код (>>) :: NoIO a -> NoIO b -> NoIO b Исходный код return :: a -> NoIO a Исходный код | |
| Monad ReadP | С версии: base-2.1 |
Определено в 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 |
| Monad (Either e) | С версии: base-4.4.0.0 |
| Monad (U1 :: Type -> Type) | С версии: base-4.9.0.0 |
| Monoid a => Monad ((,) a) | С версии: base-4.9.0.0 |
| Monad (ST s) | С версии: base-2.1 |
| Monad (Proxy :: Type -> Type) | С версии: base-4.7.0.0 |
| ArrowApply a => Monad (ArrowMonad a) | С версии: base-2.1 |
Определено в 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 m => Monad (WrappedMonad m) | С версии: base-4.7.0.0 |
Определено в Control.Applicative Методы(>>=) :: WrappedMonad m a -> (a -> WrappedMonad m b) -> WrappedMonad m b Source (>>) :: WrappedMonad m a -> WrappedMonad m b -> WrappedMonad m b Source return :: a -> WrappedMonad m a Source | |
| Monad (ST s) | Since: base-2.1 |
| Monad f => Monad (Rec1 f) | Since: base-4.9.0.0 |
| (Monoid a, Monoid b) => Monad ((,,) a b) | Since: base-4.14.0.0 |
| Monad f => Monad (Alt f) | Since: base-4.8.0.0 |
| Monad f => Monad (Ap f) | Since: base-4.12.0.0 |
| Monad m => Monad (Kleisli m a) | Since: base-4.14.0.0 |
| Monad ((->) r :: Type -> Type) | Since: base-2.1 |
Определено в GHC.Base Методы(>>=) :: (r -> a) -> (a -> r -> b) -> r -> b Исходный код (>>) :: (r -> a) -> (r -> b) -> r -> b Исходный код return :: a -> r -> a Исходный код | |
| (Monad f, Monad g) => Monad (f :*: g) | С момента: base-4.9.0.0 |
Определено в GHC.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 Исходный код | |
| (Моноид a, Моноид b, Моноид c) => Monad ((,,,) a b c) | С момента: base-4.14.0.0 |
Определено в GHC.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 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 (M1 i c f) | С момента: base-4.9.0.0 |
Определено в GHC.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 where Исходный код
Когда значение связывается в do-нотации, шаблон слева от <- может не совпадать. В этом случае этот класс предоставляет функцию восстановления.
Monad без экземпляра MonadFail может использоваться только совместно с шаблонами, которые всегда совпадают, такими как newtypes, кортежи, типы данных только с одним конструктором данных и необратимыми шаблонами (~pat).
Экземпляры MonadFail должны удовлетворять следующему закону: fail s должен быть левым нулём для >>=,
fail s >>= f = fail s
Если ваш Monad также MonadPlus, популярное определение —
fail _ = mzero
С момента: base-4.9.0.0
Методы
fail :: Строка -> m a Исходный код
Экземпляры
| MonadFail [] | С версии: base-4.9.0.0 |
Определено в Control.Monad.Fail Методыfail :: String -> [a] Исходный код | |
| MonadFail Maybe | С версии: base-4.9.0.0 |
Определено в Control.Monad.Fail Методыfail :: String -> Maybe a Исходный код | |
| MonadFail IO | С версии: base-4.9.0.0 |
Определено в Control.Monad.Fail Методыfail :: String -> IO a Исходный код | |
| MonadFail ReadP | С версии: base-4.9.0.0 |
Определено в Text.ParserCombinators.ReadP Методыfail :: String -> ReadP a Исходный код | |
| MonadFail ReadPrec | С версии: base-4.9.0.0 |
Определено в Text.ParserCombinators.ReadPrec Методыfail :: String -> ReadPrec a Исходный код | |
| MonadFail (ST s) | С версии: base-4.11.0.0 |
Определено в GHC.ST Методыfail :: String -> ST s a Исходный код | |
| MonadFail (ST s) | С версии: base-4.10 |
Определено в Control.Monad.ST.Lazy.Imp Методыfail :: String -> ST s a Исходный код | |
| MonadFail f => MonadFail (Ap f) | С версии: base-4.12.0.0 |
Определено в Data.Monoid Методыfail :: String -> Ap f a Исходный код | |
class (Alternative m, Monad m) => MonadPlus m where Исходный код
Моноиды, которые также поддерживают выбор и ошибки.
Минимальное полное определение
Nothing
Методы
mzero :: m a Исходный код
Нейтральный элемент mplus. Он также должен удовлетворять уравнениям
mzero >>= f = mzero v >> mzero = mzero
Определение по умолчанию:
mzero = empty
mplus :: m a -> m a -> m a Исходный код
Ассоциативная операция. Определение по умолчанию:
mplus = (<|>)
Экземпляры
| MonadPlus [] | Since: base-2.1 |
| MonadPlus Maybe | Since: base-2.1 |
| MonadPlus IO | Since: base-4.9.0.0 |
| MonadPlus ReadP | Since: base-2.1 |
| MonadPlus ReadPrec | Since: base-2.1 |
| MonadPlus STM | Since: base-4.3.0.0 |
| MonadPlus Option | Since: base-4.9.0.0 |
| MonadPlus (U1 :: Type -> Type) | Since: base-4.9.0.0 |
| MonadPlus (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
| (ArrowApply a, ArrowPlus a) => MonadPlus (ArrowMonad a) | Since: base-4.6.0.0 |
Определено в Control.Arrow Методыmzero :: ArrowMonad a a0 Source mplus :: ArrowMonad a a0 -> ArrowMonad a a0 -> ArrowMonad a a0 Source | |
| MonadPlus f => MonadPlus (Rec1 f) | Since: base-4.9.0.0 |
| MonadPlus f => MonadPlus (Alt f) | Since: base-4.8.0.0 |
| MonadPlus f => MonadPlus (Ap f) | Since: base-4.12.0.0 |
| MonadPlus m => MonadPlus (Kleisli m a) | Since: base-4.14.0.0 |
| (MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) | Since: base-4.9.0.0 |
| (MonadPlus f, MonadPlus g) => MonadPlus (Product f g) | Since: base-4.9.0.0 |
| MonadPlus f => MonadPlus (M1 i c f) | Since: base-4.9.0.0 |
Функции
Соглашения об именовании
Функции в этой библиотеке используют следующие соглашения об именовании:
- Постфикс '
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
Основные функции Monad
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) Source
Сопоставляет каждый элемент структуры с монадическим действием, вычисляет эти действия слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. mapM_.
mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m () Source
Применяет к каждому элементу структуры монадическое действие, вычисляет эти действия слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. mapM.
Начиная с base 4.8.0.0, mapM_ это просто traverse_, специализированное для Monad.
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) Source
forM — это mapM с переставленными аргументами. Для версии, которая игнорирует результаты, см. forM_.
forM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m () Source
forM_ — это mapM_ с переставленными аргументами. Для версии, которая не игнорирует результаты, см. forM.
Начиная с base 4.8.0.0, forM_ это просто for_, специализированное для Monad.
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) Source
Вычисляет каждое монадическое действие в структуре слева направо и собирает результаты. Для версии, которая игнорирует результаты, см. sequence_.
sequence_ :: (Foldable t, Monad m) => t (m a) -> m () Source
Вычисляет каждое монадическое действие в структуре слева направо и игнорирует результаты. Для версии, которая не игнорирует результаты, см. sequence.
Начиная с base 4.8.0.0, sequence_ это просто sequenceA_, специализированное для Monad.
(=<<) :: Monad m => (a -> m b) -> m a -> m b infixr 1 Source
То же самое, что и >>=, но с переставленными аргументами.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c infixr 1 Source
Слева направо композиция стрелок Клейсли.
'(bs >=> cs) a' можно интерпретировать как выражение do
do b <- bs a cs b
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c infixr 1 Source
Справа налево композиция стрелок Клейсли. (>=>), с переставленными аргументами.
Обратите внимание, как этот оператор напоминает композицию функций (.):
(.) :: (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
Повторяет действие бесконечно.
Используя ApplicativeDo: 'forever as' можно интерпретировать как псевдо-do выражение
do as as ..
с as повторением.
Примеры
Общее применение 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
void :: Functor f => f a -> f () Source
void value отбрасывает или игнорирует результат вычисления, например, возвращаемое значение IO действия.
Используя ApplicativeDo: 'void as' можно интерпретировать как выражение do
do as pure ()
с выведенным Functor ограничением.
Примеры
Заменить содержимое Maybe Int на единицу:
>>> void Nothing Nothing >>> void (Just 3) Just ()
Заменить содержимое Either Int Int на единицу, что приводит к Either Int ():
>>> void (Left 8675309) Left 8675309 >>> void (Right 8675309) Right ()
Заменить каждый элемент списка на единицу:
>>> void [1,2,3] [(),(),()]
Заменить второй элемент пары на единицу:
>>> 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 — запуск 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. Начиная с base 4.8.0.0, msum — это просто asum, специализированное для MonadPlus.
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 на основе списков.
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 выполняет действие n раз, собирая результаты.
Используя ApplicativeDo: 'replicateM 5 as' можно понимать как выражение do
do a1 <- as a2 <- as a3 <- as a4 <- as a5 <- as pure [a1,a2,a3,a4,a5]
Обратите внимание на ограничение Applicative.
replicateM_ :: Applicative m => Int -> m a -> m () Source
Подобно replicateM, но отбрасывает результат.
Условное выполнение монадических выражений
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 () Source
Условное выполнение выражений Applicative. Например,
when debug (putStrLn "Debugging")
выведет строку Debugging если булево значение debug равно True, и в противном случае ничего не сделает.
unless :: Applicative f => Bool -> f () -> f () Source
Обратная функция к when.
Операторы подъёма монады
liftM :: Monad m => (a1 -> r) -> m a1 -> m r Source
Поднятие функции в монаду.
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r Source
Поднятие функции в монаду, сканируя монадические аргументы слева направо. Например,
liftM2 (+) [0,1] [0,2] = [0,2,1,3] liftM2 (+) (Just 1) Nothing = Nothing
liftM3 :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r Source
Поднятие функции в монаду, сканируя монадические аргументы слева направо (см. liftM2).
liftM4 :: Monad m => (a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r Source
Поднятие функции в монаду, сканируя монадические аргументы слева направо (см. liftM2).
liftM5 :: Monad m => (a1 -> a2 -> a3 -> a4 -> a5 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m r Source
Поднятие функции в монаду, сканируя монадические аргументы слева направо (см. liftM2).
ap :: Monad m => m (a -> b) -> m a -> m b Source
Во многих случаях операции liftM могут быть заменены использованием ap, которая продвигает применение функций.
return f `ap` x1 `ap` ... `ap` xn
эквивалентно
liftMn f x1 x2 ... xn
Жесткие монадические функции
(<$!>) :: Monad m => (a -> b) -> m a -> m b infixl 4 Source
Жесткая версия <$>.
С версии: 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/8.10.2/docs/html/libraries/base-4.14.1.0/Control-Monad.html