2012-05-26 5 views
9

명백한 이유로 다음은 작동하지 않습니다.Clojure에서 monoid 프로토콜을 작성하는 방법은 무엇입니까?

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

mzero 제로 인수가, 제로 인수 방법은 프로토콜에 (이해가되지 않거나)는 허용되지 않습니다. 디스패치가 가치 기반이 아닌 유형 기반 인 하스켈이나 스칼라에서 이것은 문제가되지 않습니다.

Clojure에서 Monoid 프로토콜을 개념화하고 작성하는 올바른 방법은 무엇입니까?

+0

왜 모듈이 아닌 프로토콜이 필요합니까? 다른 구현을 기대하고 있다면 특정 유스 케이스에서 어떤 구현이 필요한지 추측 할 수 있습니까? (나는 그것이 좋은 질문이라고 생각한다, 나는 관련 문제를 쫓아 내려고 노력하고있다). –

+1

@andrewcooke 하스켈은 사용 사이트의 정적 유형을 기반으로합니다. 호출 된 메서드는 정적으로 처리됩니다. –

+0

@andrewcooke, 진술 문맥에서 모듈이란 무엇을 의미합니까? – missingfaktor

답변

5

source을 보면, 이것이 new reducers library에서 구현되는 방식은 procotol가 아니라 오버로드 된 기능입니다. no-args 호출은 mzero입니다. 두 args 호출 mappend입니다.

더 정확하게, monoid는 두 개의 인수를 취 - opctor을하고, 인수없이 호출 할 때, ctor을 평가하는 기능을 반환하고 op에 두 대표와 함께 호출 할 때.

이것은 접기에서 0을 처리하는 방법과 일치합니다. 예를 들어 -reduce (fold)은 필요한 경우 0을 찾기 위해 args없이 접혀진 함수를 평가합니다.

내가보기에 너무 무언가를 보여주는 것을 부끄러워하지만, 나는 당신이 clojure에서 더 잘할 수있는 방법을 보지 못한다. 의견에 대한 설명/교육에 감사드립니다.

+0

좋아요, 그 질문에 답합니다. 고맙습니다! – missingfaktor

관련 문제