From 94f603807f9271bb2a265e0290b9343b56350d86 Mon Sep 17 00:00:00 2001 From: Andrew Laptev Date: Sun, 28 Oct 2018 13:48:12 +0300 Subject: [PATCH] [Haskell] Russian translate for monad/index.md (#20865) --- guide/russian/haskell/monad/index.md | 47 ++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/guide/russian/haskell/monad/index.md b/guide/russian/haskell/monad/index.md index 8bd00c6d7c..4c4d9d1c7e 100644 --- a/guide/russian/haskell/monad/index.md +++ b/guide/russian/haskell/monad/index.md @@ -2,11 +2,46 @@ title: Monad localeTitle: монада --- -# Законы Монады +# Законы Монад -Существует 3 закона, которые должны удовлетворяться типом данных, который должен рассматриваться как монада +Существует 3 правила, которые ещё называются законами, которым должны удовлетворять те типы данных, которые хотят быть монадами (на самом деле, это не совсем так, мы можем создать тип, который будет в хаскеле монадой, но не соответствовать законом. Это не запрещено, но очень не приветствуется) -# Возможно, Монада +## Левая единица (Left Identity) +`return a >>= f` = `f a` + +Здесь говорится о том, что если мы берём значение и возвращаем его в контексте (заключаем его в монаду), +а затем используем `>>=` для передачи его в функцию, то эта операция - то же самое, что и +прменение этой функции к исходному значению. + +## Правая единица (Right Identity) +`m >>= return` = `m` + +А тут говорится о том, что когда мы используем `>>=` для передачи монадического (заключённого) значения +в функцию `return`, мы получаем изначальное монадическое (заключённое) значение. + +## Ассоциативность (Associativity) +`(m >>= f) >>= g` = `m >>= (\x -> f x >>= g)` + +Этот закон позволяет нам связывать вызовы монадических функций не смотря на их вложенность. + +Это может показаться очевидным, и Вы можете подумать, что так и должно быть, +но на самом деле ассоциативность обязательна для такого поведения. + +# Так что на счёт `>>=` и `return`? +Всё просто: + +`>>=`, или 'bind' берёт монаду и функцию, которая принимает на вход чистое значение +и возвращает монаду, после этого применяет эту функцию к монаде. Это позволяет нам +работать с данными внутри монады, которые не могут быть по-другому доступы другим, +немонадическим функциям. + +`return`, с другой стороны, берёт некое значение и возвращает монаду, содержащую +это значение. Наверное, всё, что вы хотели бы знать про `return`, её тип: +```haskell +return :: a -> m a +``` + +# Монада Maybe ```haskell justHead :: Maybe Char @@ -15,11 +50,11 @@ justHead :: Maybe Char return x ``` -# Список Монад +# Монада List -возврат такой же, как чистый аппликативный +возвращает тоже самое значение, что и функция `pure` для класса типов `Applicative` экземпляр Monad \[\], где return x = \[x\] xs >> = f = concat (map f xs) -fail \_ = \[\] \ No newline at end of file +fail \_ = \[\]