2012-05-26 13 views
9

Quanto segue non funziona, per ovvi motivi.Come scrivere il protocollo monoid in Clojure?

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

mzero ha zero argomenti, e zero metodi argomento non permessi (o non hanno senso) in protocolli. In Haskell o Scala, dove la distribuzione è basata sui tipi piuttosto che sul valore, questo non è un problema.

Quale sarebbe il modo corretto di concettualizzare e scrivere il protocollo Monoid in Clojure?

+0

perché ti serve un protocollo piuttosto che un modulo? se si aspettano implementazioni diverse, in che modo haskell deduce quale implementazione è necessaria in un particolare caso d'uso? (Penso che sia una buona domanda, sto solo cercando di inseguire il problema in questione). –

+1

@ andrewcooke Haskell si basa sul tipo statico sul sito di utilizzo. Il metodo chiamato viene risolto staticamente. –

+0

@andrewcooke, cosa significherebbe il modulo nel contesto della tua affermazione? – missingfaktor

risposta

5

guardando il source, il modo in cui questo è implementato nel new reducers library non è un procotol ma una funzione sovraccaricata. una chiamata di no-arg è mzero; la chiamata di due args è mappend.

più esattamente, monoid prende due argomenti - op e ctor e restituisce una funzione che, quando viene chiamato senza argomenti, valuta ctor, e quando viene chiamato con due, delegati a op.

Questo è coerente con il modo in cui lo zero viene gestito in una piega, ad esempio - reduce (piega) valuterà la funzione che viene piegata senza argomenti per trovare lo zero, se necessario.

Mi vergogno un po 'di mostrare qualcosa di così poco eccitante, ma non vedo come si possa fare meglio all'interno del clojure. grazie per le spiegazioni/educazione nei commenti.

+0

Ok, questo risponde alla domanda. Grazie! – missingfaktor

Problemi correlati