Реализация представителя класса типов Monad на примере контейнера Identity

Identity представляет собой коробочку в которую упаковывают любой другой произвольный тип. Identity имеет всего один конструктор поэтому удобно определить ее с помощью ключевого слова newtype.
runIdentity - это метка доступа, которая является акцессором для значения a.

Для того чтобы сделать Identity монадой надо реализовать две функции return и bind.

Реализация:

Тривиальную стрелку Клейсли определяет нам оператор return. Определим нетривиальную стрелку Клейсли:
Функция wrap'n'succ превращает значение Integer в значение лежащее в контейнере Identity и увеличивает это значение на единицу.

Простейший запуск вычисления в монаде:

Монадическое связывание:

То же самое вычисление, но без монадического интерфейса:

С помощью оператора return можно привести функцию к вышеприведенному виду: