Как написать моноидный протокол в Clojure?

Следующее не работает по понятным причинам.

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

mzero имеет нулевые аргументы, а методы с нулевым аргументом не разрешены (или не имеют смысла) в протоколах. В Haskell или Scala, где диспетчеризация основана на типах, а не на значениях, это не проблема.

Какой будет правильный способ осмысления и написанияMonoid протокол в Clojure?

 andrew cooke26 мая 2012 г., 20:51
@missingfaktor - то, что я сказал, было неправильно. я должен был сказать, чтоmappend будет в протоколе, но эквивалентmzero будет функция, которая создает реализацию этого протокола (и живет в пространстве имен - модуль - с реализацией). что я пропускаю, из вышесказанного, как что-то вродеmzero может подразумеваться контекстомseparately из конкретной реализации.
 missingfaktor26 мая 2012 г., 20:34
@andrewcooke, что бы значил модуль в контексте вашего заявления?
 missingfaktor26 мая 2012 г., 20:53
@andrewcooke, этот пример может помочь понять, как это работает в Haskell:ideone.com/j1nnz.
 Don Stewart26 мая 2012 г., 20:31
@andrewcooke Haskell выводит на основании статического типа на сайте использования. Вызываемый метод разрешается статически.
 andrew cooke26 мая 2012 г., 19:58
зачем вам это протокол, а не модуль? если вы ожидаете разных реализаций, то как haskell определит, какая реализация требуется в конкретном случае использования? (я думаю, что это хороший вопрос, я просто пытаюсь разобраться с этой проблемой).

Ответы на вопрос(1)

Решение Вопроса

источникто, как это реализовано вновая библиотека редукторов не как прокотол, а как перегруженная функция. вызов без аргументов - mzero; вызов двух аргументов это mappend.

точнее,monoid принимает два аргумента -op а такжеctor и возвращает функцию, которая при вызове без аргументов вычисляетctorи когда вызывается с двумя, делегатыop.

это согласуется с тем, как ноль обрабатывается в сгибе, например:reduce (fold) оценит складываемую функцию без аргументов, чтобы найти ноль, если это необходимо.

мне немного стыдно показывать что-то настолько неинтересное, но я не вижу, как вы можете добиться большего успеха в ближайшем будущем. спасибо за объяснения / образование в комментариях.

 missingfaktor26 мая 2012 г., 21:43
Хорошо, это отвечает на вопрос. Спасибо!

Ваш ответ на вопрос