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?
To jest dobre pytanie, czy można przepisać, aby było bardziej zrozumiałe? Jest trochę trudny do odczytania z powodu błędów. –
Wygląda na to, że nie złamałoby to prawa, jeśli 'return's się nie liczy. – fuz
@Matt Fenwick, przepisuję pytanie, aby naprawić gramatykę. – Zhen