Подтвердить что ты не робот

Clojure замена для ADT и соответствия шаблону?

Всякий раз, когда в Haskell нам нужен какой-то вариантный тип данных, мы будем использовать ADT в сочетании с сопоставлением с образцом. Что люди Clojure используют для таких случаев?

4b9b3361

Ответ 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 очень похоже на библиотеку соответствия шаблону.

Факт наличия как ключевых слов, так и символов делает реализацию варианта довольно простой поверх библиотеки, соответствующей шаблону.