2011-10-31 3 views
7

Pensando alla monade, mi è venuta l'idea di una monade come via per rompere con l'architettura di Von Neumann. L'architettura di Von Neumann utilizza una serie di istruzioni (chiamate programma) per modificare i dati in memoria e l'esecuzione di ciascuna istruzione del programma aggiorna un contatore di programma per sapere quale istruzione è l'esecuzione successiva.È possibile creare una Monade che conta il numero di istruzioni?

Se pensiamo all'architettura Von Neumann come monade, l'operatore di bind (>> =) aggiorna il contatore del programma. Possiamo creare una Monade che rompa l'architettura di Von Neumann per fare di più nel vicolo cieco. Ad esempio, possiamo avere una Monade che conta il numero di istruzioni eseguite nei nostri programmi.

Ma, quando ho cercato di attuare tale Monade in Haskell come:

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 

mi accorgo che romperà le leggi de Monadi, ad esempio:

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

I due blocchi sono gli stessi perché le leggi della monade, ma restituiranno qualcosa di diverso perché hanno un numero diverso di istruzioni (frasi)

Ho fatto qualcosa di sbagliato? o non è possibile avere tale Monade?

+0

Questa è una buona domanda, potresti riscrivere per renderlo più chiaro? È un po 'difficile da leggere a causa degli errori. –

+0

Beh, sembra che non infrangerebbe quelle leggi, se "return" non conta. – fuz

+0

@ Matt Fenwick, riscrivo la domanda per sistemare la grammatica. – Zhen

risposta

8

In senso stretto, una tale "monade" infrange le leggi della monade ed è quindi ... non una monade. Vedi questo previous question for details. In altre parole: la tua ipotesi è corretta, non è possibile avere una tale monade.

1

L'implementazione elimina il numero di passaggi in f. Non dovresti aggiungerli?

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

Hai ragione, ma non aggiusta le leggi della monade. Dovrebbe essere (n1 + n2 + 1). – Zhen