2010-08-22 10 views

답변

9

글쎄, 사실 Clojure 용으로 작성된 패턴 일치 라이브러리가 있습니다. Clojure의 매크로는 이러한 일을 가능하게합니다. Matchure은 가장 최근의 것 중 하나입니다. ADTs in contrib에 대한 정보도 있습니다.

Clojure 코어에서 하스켈의 ADT와 가장 가까운 것은 Clojure 1.2의 새로운 레코드와 데이터 유형이다. 그러나 레코드 나 데이터 유형을 사용함으로써 얻을 수있는 이점이 필요하지 않다면 일반적으로 맵을 사용할 것입니다. Clojure는 역동적 인 언어이므로, 어쨌든 레코드 등을 사용하면 정적 유형 검사를하지 않아도됩니다.

Clojure는 패턴 매칭을 연상시키는 "destructuring"을 가지고 있으며, 관용적 인 Clojure에서 많이 사용됩니다. thisthis을 참조하십시오. 전자는 당신의 답변입니다. ; P

1

봐 라이브러리 matchure에 - 그것은

0

나는 그렇 패턴 일치 라이브러리로 아주 많이 좋아 근처 시간에 Clojure의-있는 contrib에 포함되어야한다.

키워드와 기호를 모두 사용한다는 사실은 패턴 일치 라이브러리 상단에서 매우 쉽게 변형을 구현합니다.

3

당신이하고있는 일에 조금 달려 있습니다. 그러나 데이터 유형에 따라 다형성 (polymorphic)을 원하는의 일반적인 경우를 가정하면, 프로토콜은 종종 좋은 방법이다 : 이러한 맥락에서

(defprotocol Fooable 
    (foo [x])) 

(defrecord AType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "A value: " (:avalue x))))) 

(defrecord BType [avalue] 
    Fooable 
    (foo [x] 
     (println (str "B value: " (:bvalue x))))) 

(foo (AType. "AAAAAA"))  
=> A value: AAAAAA 

(foo (BType. "BBBBBB"))  
=> B value: BBBBBB 

, 프로토콜은 효과적으로 ADT에 원하는 작업의 집합을 정의하고 기록 정의 ADT의 가능한 값 및 프로토콜 함수에 대한 다형성 (polymorphic) 동작.