Думая о монаде, мне пришла в голову идея монады как способа порвать с архитектурой фон Неймана.Архитектура фон Неймана использует набор инструкций (называемых программами) для изменения данных в памяти, и при выполнении каждой инструкции программы обновляется счетчик программ, чтобы узнать, какая команда является следующей для выполнения.
Если мы считаем архитектуру фон Неймана монадой, оператор связывания (>> =) обновляет счетчик программы.Мы можем создать монаду, которая ломает архитектуру фон Неймана, чтобы сделать больше в связке.Например, у нас может быть Monad, который подсчитывает количество инструкций, выполненных в наших программах.
Но когда я попытался реализовать эту Monad в 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
Два блока одинаковы, потому что законы монад, но они будут возвращать что-то другое, потому что у них разное количество инструкций (предложений)
Я сделал что-то не так?или нельзя иметь такую монаду?