Думая о монаде, мне пришла в голову идея монады как способа порвать с архитектурой фон Неймана. Архитектура фон Неймана использует набор инструкций (называемых программой) для изменения данных в памяти, и выполнение каждой инструкции программы обновляет счетчик программы, чтобы узнать, какая инструкция будет выполняться следующей.
Если рассматривать архитектуру фон Неймана как монаду, оператор связывания (>> =) обновляет счетчик программы. Мы можем создать монаду, которая сломает архитектуру фон Неймана, чтобы сделать больше в привязке. В качестве примера у нас может быть монада, которая подсчитывает количество инструкций, выполненных в наших программах.
Но когда я попытался реализовать эту Монаду в haskell как:
data Counter a = Counter Integer a
deriving( Show )
instance Monad Counter where
(Counter n1 a) >>= f = let Counter _ b = f a
in (Counter (n1+1) b)
return a = Counter 1 a
Я заметил, что это нарушит законы де Монад, например:
return x >>= f /= f x
do
a <- return 3
return a
do
return 3
Два блока одинаковы, потому что законы монад, но они вернутся что-то другое, потому что у них разное количество инструкций (предложений)
Я что-то сделал не так? или Невозможно иметь такую Монаду?