2011-10-31 5 views
7

Pensando en la mónada, me surgió la idea de una mónada como la forma de romper con la arquitectura de Von Neumann. La arquitectura de Von Neumann utiliza un conjunto de instrucciones (llamadas programa) para cambiar los datos en la memoria y la ejecución de cada instrucción del programa actualiza el contador de un programa para saber a quién le corresponde ejecutar la instrucción.¿Es posible crear una mónada que cuente el número de instrucciones?

Si pensamos en la arquitectura Von Neumann como una mónada, el operador bind (>> =) actualiza el contador del programa. Podemos hacer una Mónada que rompa la arquitectura de Von Neumann para hacer más en el enlace. Como ejemplo, podemos tener una Mónada que cuente la cantidad de instrucciones ejecutadas en nuestros programas.

Pero, cuando traté de poner en práctica esa mónada en Haskell como:

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 

noto que va a romper las leyes de Mónadas, por ejemplo:

return x >>= f   /= f x 

do 
    a <- return 3 
    return a 

do 
    return 3 

Los dos bloques son los mismos porque las leyes de mónada, pero devolverán algo diferente porque tienen diferente número de instrucciones (oraciones)

¿Hice algo mal? o ¿no es posible tener dicha mónada?

+0

Esta es una buena pregunta, ¿podría reescribirla para dejarla más clara? Es un poco difícil de leer debido a los errores. –

+0

Bueno, parece que no violaría esas leyes, si 'return's no cuenta. – fuz

+0

@Matt Fenwick, reescribo la pregunta para corregir la gramática. – Zhen

Respuesta

8

Estrictamente hablando, cualquier "mónada" rompe las leyes de la mónada y por lo tanto ... no es una mónada. Vea esto previous question for details. En otras palabras, tu suposición es correcta, no es posible tener tal mónada.

1

Su implementación elimina el número de pasos en f. ¿No deberías agregarlos?

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

Tiene razón, pero no repara las leyes de mónadas. Debería ser (n1 + n2 + 1). – Zhen

Cuestiones relacionadas