Алгебраические типы данных Clojure

Я нашел макрос defadt в clojure.contrib. типы. К сожалению, полезной документации по использованию ADT в clojure нет. Я часами гуглил и нашел крошечные фрагменты информации об этом. Что такое ADT в clojure? Как их использовать? Любая информация будет полезна :)


person zw0rk    schedule 25.03.2011    source источник


Ответы (2)


Некоторую информацию можно найти в examples.clj в src / clojure / contrib / types. Он показывает пример древовидной структуры, определенной как adt:

(defadt ::tree
  empty-tree
  (leaf value)
  (node left-tree right-tree))

Больше информации в исходном файле.

person Maurits Rijk    schedule 27.03.2011
comment
Defadt устарел? - person Didier A.; 20.03.2017

Здесь есть действительно интересный пример ADT в Clojure, :

Мы определяем генератор ADT следующим образом:

(defmacro data
  [adt-name equals-sign & constructors]
  `(do
     (defn ~(symbol (str adt-name "?")) [~'obj]
       (= ~(str adt-name) (adt-name ~'obj)))
     ~@(for [[type-name & fields]
             (filter (partial not= '(|))
                     (partition-by (partial = '|) constructors))]
         (apply (partial emit-constructor adt-name type-name)
                 fields))))

Учитывая пример Haskell:

data Tree a = Empty
        | Leaf a
        | Node Tree Tree

Затем мы пишем Clojure

(data Tree = Empty | Leaf value | Node left right)

Что довольно круто.

person hawkeye    schedule 04.07.2016