Можно ли создать монаду, которая считает количество инструкций?

Думая о монаде, мне пришла в голову идея монады как способа порвать с архитектурой фон Неймана. Архитектура фон Неймана использует набор инструкций (называемых программой) для изменения данных в памяти, и выполнение каждой инструкции программы обновляет счетчик программы, чтобы узнать, какая инструкция будет выполняться следующей.

Если рассматривать архитектуру фон Неймана как монаду, оператор связывания (>> =) обновляет счетчик программы. Мы можем создать монаду, которая сломает архитектуру фон Неймана, чтобы сделать больше в привязке. В качестве примера у нас может быть монада, которая подсчитывает количество инструкций, выполненных в наших программах.

Но когда я попытался реализовать эту Монаду в 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

Два блока одинаковы, потому что законы монад, но они вернутся что-то другое, потому что у них разное количество инструкций (предложений)

Я что-то сделал не так? или Невозможно иметь такую ​​Монаду?

7
задан Joel Coehoorn 9 December 2011 в 17:29
поделиться