Предположение: Я в курсе ADT библиотек here. Они классные. Может быть, они могут быть лучше.Что необходимо для реализации ADT в Clojure?
Существует очень интересный пример АТД в Clojure here:
Определим ADT генератор вроде этого:
(defmacro data
[adt-name equals-sign & constructors]
`(do
(defn ~(symbol (str adt-name "?")) [~'obj]
(= ~(str adt-name) (adt-name ~'obj)))
[email protected](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)
Это довольно круто.
Теперь я чувствую, что что-то не хватает для соответствия с эквивалентом Haskell, но я не могу сказать, что это такое.
Мой вопрос: Что необходимо для внедрения ADT в Clojure?
не ADT без более или менее бесполезны клетчатых типов? Я думаю, вы могли бы представить ADT, как это катаморфизм ... (кстати: шаблон сопоставление/катаморфизм использовать значение то, что я хотел бы рассмотреть без вести - конечно, я не понимаю, Clojure вовсе не так, возможно, это * emited * как-то слишком) – Carsten