2012-05-26 16 views
9

Lo siguiente no funciona, por razones obvias.Cómo escribir el protocolo monoide en Clojure?

(defprotocol Monoid 
    (mappend [a b]) 
    (mzero [])) 

mzero tiene cero argumentos, y no se permiten los métodos de argumento cero (o no tienen sentido) en los protocolos. En Haskell o Scala, donde el despacho se basa en el tipo y no en el valor, esto no es un problema.

¿Cuál sería la forma correcta de conceptualizar y escribir el protocolo Monoid en Clojure?

+0

¿por qué es necesario que sea un protocolo en lugar de un módulo? si está esperando implementaciones diferentes, entonces, ¿cómo podría Haskell inferir qué implementación se requiere en un caso de uso particular? (Creo que es una buena pregunta, solo estoy tratando de buscar el tema en cuestión). –

+1

@andrewcooke Haskell infiere basado en el tipo estático en el sitio de uso. El método que se llama se resuelve estáticamente. –

+0

@andrewcooke, ¿qué significaría el módulo en el contexto de su declaración? – missingfaktor

Respuesta

5

mirando el source, la forma en que esto se implementa en el new reducers library no es como un procotol sino como una función sobrecargada. una llamada sin argumentos es mzero; dos llamadas args es mappend.

más exactamente, monoid toma dos argumentos - op y ctor y devuelve una función que, cuando se llama sin argumentos, evalúa ctor, y cuando se le llama, con dos delegados a op.

esto es coherente con cómo se maneja el cero en un pliegue, por ejemplo - reduce (pliegue) evaluará la función que se va a plegar sin args para encontrar el cero, si es necesario.

me siento un poco avergonzado de mostrar algo tan poco interesante, pero no veo cómo puede hacerlo mejor dentro de clojure. gracias por las explicaciones/educación en los comentarios.

+0

Bien, eso responde la pregunta. ¡Gracias! – missingfaktor

Cuestiones relacionadas