Монада — это тройка (m, return, >>=) class Monad m where (>>=) :: m a → (a → m b) → m b return :: a → m a Законы монад 1. (return x >>= f) = f x 2. ((x >>= f) >>= g) = (x >>= (\y → f y >>= g)) 3. (x >>= return) = x (x >>= (\a → return a)) = x
Класс list: ― Класс-контейнер; ― Метод chainmap, который применяет функцию func для каждого элемента контейнера; ― Функция func берет элемент x и возвращает экземпляр list с одним или несколькими значениями; ― Метод chainmap сливает списки в экземпляр класса list;
Класс list: ― Класс-контейнер; ― Метод chainmap, который применяет функцию func для каждого элемента контейнера; ― Функция func берет элемент x и возвращает экземпляр list с одним или несколькими значениями; ― Метод chainmap сливает списки в экземпляр класса list; Это монада
Монадический тип: ― Класс-контейнер; ― Функция связывания, которая берет элемент из контейнера и делает из него новый контейнер; ― Тип умеет брать контейнеры, полученные в результате работы функции связывания и организовывать новый.
Монада — это тройка (m, return, >>=) class Monad m where (>>=) :: m a → (a → m b) → m b return :: a → m a Законы монад 1. (return x >>= f) = f x 2. ((x >>= f) >>= g) = (x >>= (\y → f y >>= g)) 3. (x >>= return) = x
class MessageLog: def __init__(self, value, message=None): self.messages = [] if message is not None: self.messages.append(message) self.value = value def bind(self, func): If isinstance(self, Nothing): return self try: value = func(self.value) except Exception as e: value = Nothing if isinstance(value, Nothing): return value monad = MessageLog(value.value) monad.messages = self.messages + value.messages return monad