@graninas по поводу монад, можно рассматривать паттерн "Монада", это такой класс, в котором есть pure/bind, что-то с законами и т.п.
И тогда для работы можно замечать что этот паттерн применим. Это возможно в очень многих языках,
В языках HKT - есть абстракция Monad. Это значит, что можно писать абстрактные функции, которые могут работать с любым типом, у
которого есть "интерфейс" Monad. Это позволяет писать стандартную библиотеку работающую с любыми монадами, так же позволяет
написать mtl, transformers и прочие либы, без переписывания одного кода много раз.
Второе выше называли монадическим программированием, и паттерн Monad это необходимая, но не достаточная часть.