Всякий раз, когда в Haskell нам нужен какой-то вариантный тип данных, мы будем использовать ADT в сочетании с сопоставлением с образцом. Что люди Clojure используют для таких случаев?
Clojure замена для ADT и соответствия шаблону?
Ответ 1
Ну, на самом деле есть несколько библиотек соответствия шаблонов, написанных для Clojure. Макросы Clojure делают такую вещь возможной. Matchure является одним из самых последних. Есть даже некоторые вещи для ADT в Contrib.
Невзирая на это, самое близкое к ADTs Haskell в ядре Clojure - это новые записи и типы данных в Clojure 1.2. Но, если вам не нужны преимущества, связанные с использованием записи или типа данных, вы обычно просто используете карту. Clojure - динамический язык, поэтому вы не станете проверять статический тип, если используете запись и все равно.
Clojure имеет "деструктурирование", которое напоминает совпадение с образцом и много используется в идиоматическом Clojure. См. this и this. Первый ответ на ваш вопрос действительно здесь.; Р
Ответ 2
Это немного зависит от того, что вы пытаетесь сделать. Но, предполагая общий случай отсутствия полиморфного поведения на основе типа данных, протоколы часто являются хорошим подходом:
(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, а также полиморфное поведение для функций протокола.
Ответ 3
Посмотрите на matchure библиотека - она должна быть включена в clojure -contrib в ближайшее время
Ответ 4
Мне нравится yap очень похоже на библиотеку соответствия шаблону.
Факт наличия как ключевых слов, так и символов делает реализацию варианта довольно простой поверх библиотеки, соответствующей шаблону.