Wie schreibe ich Monoid-Protokoll in Clojure?

9

Folgendes funktioniert aus offensichtlichen Gründen nicht.

%Vor%

mzero hat null Argumente und Null-Argument-Methoden sind in Protokollen nicht erlaubt (oder sind nicht sinnvoll). In Haskell oder Scala, wo der Versand typenbasiert und nicht wertbasiert ist, ist dies kein Problem.

Was wäre der richtige Weg, um das Monoid -Protokoll in Clojure zu konzipieren und zu schreiben?

    
missingfaktor 26.05.2012, 16:05
quelle

1 Antwort

5

Blick auf die Quelle , den Weg dass dies in der neuen Reducer-Bibliothek ist nicht wie ein Procotol, sondern eine überladene Funktion. Ein No-Args-Aufruf ist mzero; zwei args call ist mappend.

genauer, monoid nimmt zwei Argumente - op und ctor und gibt eine Funktion zurück, die, wenn sie ohne Argumente aufgerufen wird, ctor auswertet, und wenn sie mit zwei aufgerufen wird, auf op .

Dies ist konsistent mit der Behandlung von Null in einer Faltung, zum Beispiel - reduce (falten) wertet die Funktion aus, die ohne Argumente gefaltet wird, um gegebenenfalls die Null zu finden.

Ich schäme mich ein wenig, etwas so Unspektakuläres zu zeigen, aber ich sehe nicht, wie man in clojure besser sein kann. Danke für die Erklärungen / Bildung in den Kommentaren.

    
andrew cooke 26.05.2012, 19:02
quelle