하스켈에서 변형 데이터 형식이 필요할 때마다 패턴 매칭과 함께 ADT를 사용합니다. Clojure 사람들은 그런 용도로 무엇을 사용합니까?ADT 및 패턴 일치를위한 Clojure 대체?
답변
글쎄, 사실 Clojure 용으로 작성된 패턴 일치 라이브러리가 있습니다. Clojure의 매크로는 이러한 일을 가능하게합니다. Matchure은 가장 최근의 것 중 하나입니다. ADTs in contrib에 대한 정보도 있습니다.
Clojure 코어에서 하스켈의 ADT와 가장 가까운 것은 Clojure 1.2의 새로운 레코드와 데이터 유형이다. 그러나 레코드 나 데이터 유형을 사용함으로써 얻을 수있는 이점이 필요하지 않다면 일반적으로 맵을 사용할 것입니다. Clojure는 역동적 인 언어이므로, 어쨌든 레코드 등을 사용하면 정적 유형 검사를하지 않아도됩니다.
Clojure는 패턴 매칭을 연상시키는 "destructuring"을 가지고 있으며, 관용적 인 Clojure에서 많이 사용됩니다. this 및 this을 참조하십시오. 전자는 당신의 답변입니다. ; P
봐 라이브러리 matchure에 - 그것은
나는 그렇 패턴 일치 라이브러리로 아주 많이 좋아 근처 시간에 Clojure의-있는 contrib에 포함되어야한다.
키워드와 기호를 모두 사용한다는 사실은 패턴 일치 라이브러리 상단에서 매우 쉽게 변형을 구현합니다.
당신이하고있는 일에 조금 달려 있습니다. 그러나 데이터 유형에 따라 다형성 (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) 동작.