Можно ли создать монаду, которая подсчитывает количество инструкций? - PullRequest
7 голосов
/ 31 октября 2011

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 31 октября 2011

Строго говоря, любая такая "монада" нарушает законы монады и поэтому ... не является монадой. Подробнее см. предыдущий вопрос . Другими словами - ваша догадка верна, такая монада невозможна.

1 голос
/ 01 ноября 2011

Ваша реализация отбрасывает количество шагов в f. Разве вы не должны добавить их?

  (Counter n1 a) >>= f = let Counter n2 b = f a
                     in (Counter (n1+n2) b)
...