2011-10-31 7 views
7

Myśląc o monadzie, przyszło mi do głowy, że monada jest sposobem na zerwanie z architekturą von Neumanna. Architektura Von Neumanna wykorzystuje zestaw instrukcji (nazywany programem) do zmiany danych w pamięci, a wykonanie każdej instrukcji programu aktualizuje licznik programu, aby wiedzieć, która instrukcja jest następna do wykonania.Czy można utworzyć Monadę, która policzy liczbę instrukcji?

Jeśli pomyślimy o architekturze von Neumanna jako monadzie, operator wiązania (>> =) zaktualizuje licznik programu. Możemy stworzyć Monadę, która przełamie architekturę Von Neumanna, aby zrobić więcej w wiązaniu. Na przykład możemy mieć Monadę, która policzy liczbę instrukcji wykonanych w naszych programach.

Ale kiedy próbował wdrożyć że Monady w Haskell jak:

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 

zauważam to będzie złamać de monady ustawowe, np:

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

dwa bloki są takie same, ponieważ prawa monad, ale zwrócą coś innego, ponieważ mają różną liczbę instrukcji (zdań)

Czy zrobiłem coś złego? czy nie jest możliwe posiadanie takiego Monada?

+0

To jest dobre pytanie, czy można przepisać, aby było bardziej zrozumiałe? Jest trochę trudny do odczytania z powodu błędów. –

+0

Wygląda na to, że nie złamałoby to prawa, jeśli 'return's się nie liczy. – fuz

+0

@Matt Fenwick, przepisuję pytanie, aby naprawić gramatykę. – Zhen

Odpowiedz

8

Ściśle mówiąc, każda taka "monada" łamie prawa monad i dlatego ... nie jest monadą. Zobacz tę previous question for details. Innymi słowy - twoje przypuszczenie jest poprawne, nie można mieć takiej monady.

1

Twoja implementacja wyrzuca liczbę kroków wf. Nie powinieneś ich dodawać?

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

Masz rację, ale to nie rozwiązuje praw monady. Powinno to być (n1 + n2 + 1). – Zhen

Powiązane problemy