2012-12-14 3 views
1

하나의 데이터 유형에 대해 다중 메소드의 구현을 여러 개 만들려면 어떻게해야합니까? 동일한 유형의 다중 메소드에 대해 여러 구현을 제공 할 수 있습니까?

는 좋은 예되지 않을 수도 있습니다,하지만 난 그게 생각 보여 희망 :

repl> (def thing [[[1] []] [27] [18 [32 35]]]) 

repl> (fmap count thing) 
[2 1 2] 

을 나무로 :

repl> (fmap (partial + 1) thing) 
[[[2] []] [28] [19 [33 36]]] 

무엇입니까 두 시퀀스로 중첩 된 벡터를 처리 할 수를 동일한 유형에 대해 여러 개의 다중 메소드 구현을 작성하고 사용하는 일반적인 방법은 무엇입니까?

+0

멀티 메소드만으로는 여기에서 많은 도움이 될 것이라고 생각하지 않습니다.'defmethod'는 그 디스패치 값에 대해 정의 된 이전 메소드를 새로운 것으로 대체합니다. – Alex

+0

함수가 완전히 다른 두 가지 일을하는 경우 두 개의 다른 함수/다중 방법을 선언하지 않는 이유는 무엇입니까? – DaoWen

+0

멀티 메소드는 유형에 국한되지 않고 모든 유형에 다형성이 있습니다 (가장 일반적이지만). 따라서, 한 가지 유형으로 처리하려는 동일한 유형의 엔티티와 다른 유형으로 처리하려는 엔티티를 구별 할 수있는 방법이 있다면이 방법을 사용하십시오. –

답변

0

멀티 메소드의 아이디어는 "다른 인수"(반드시 다른 유형이 아님)에서 "동일한 연산"을한다는 것입니다. "동일한 인수"에서 "다른 연산"을 수행하려면 다중 메소드가 적합하지 않으며 @DaoWen과 같이 별도의 함수 (또는 별도의 다중 메소드)를 사용하는 것이 아마도 올바른 방법 일 것입니다. 그것에 대해 가라. 프로그래밍 방식으로 인수를 구분하는 몇 가지 방법이, 그리고 그 구별 특성에 따라 서로 다른 방법의 구현을 사용하는 개념적인 의미가있는 경우

, 당신은 차이를 만들기 위해 defmultidispatch-fn 인수를 사용할 수 있습니다.

간단한 예를 들어, foo를 dispatch-fn으로 사용하면 key : foo와 연결된 값을 다중 메소드에 단일 인수로 전달 된 맵에서 전달할 수 있습니다.

+0

답변 해 주셔서 감사합니다! 그러나, 나는 다른 작업을 사용할 수 없습니다 - Functor 추상화 전체를 무너 뜨릴 것입니다! 'dispatch-fn'을 시도해보고 어떻게 작동하는지 봅니다. 제안 해 주셔서 감사합니다! –

1

문제가 발생하면 함수 유형 (fmap first arg) 매개 변수로 디스패치해야합니다. AFAIK 함수의 인수 유형을 발견하는 쉬운 (쉬운) 방법은 없습니다 (틀린 경우 수정하십시오). 그래서 이것을 매개 변수 나 그와 비슷한 것에 메타 데이터로 추가해야합니다. 예를 들어

(defmulti fmap (fn [f _] ((comp :arg-seq? meta) f))) 

(defmethod fmap true [f col] 
    (map-tree f col)) 

(defmethod fmap false [f col] 
    (map f col)) 

(fmap (with-meta inc {:arg-seq? true}) thing) 
-> [[[2] []] [28] [19 [33 36]]] 

(fmap (with-meta count {:arg-seq? false}) thing) 
-> (2 1 2) 

그러나 이것은 좋지 않습니다. 함수 매개 변수의 유형을 얻는 다른 방법이 있다면 솔루션은보다 멋지게 보일 수 있습니다.

+0

흥미로운 제안, 감사합니다. –