Clojure эквивалент "Scrap Your Boilerplate" (SYB) на Haskell - PullRequest
11 голосов
/ 11 сентября 2011

Я нашел интересную библиотеку в Haskell под названием Scrap Your Boilerplate , основанную на статье Саймона Пейтона Джонса , которая кажется эффективным способом написания кода, который может обновлять большие, глубоко вложенныеструктуры данных на функциональном языке программирования.Он включает такой код:

incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))

increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))

, который эффективно увеличивает заработную плату на фиксированную долю k для каждого в потенциально большой и сложной структуре данных Компании.

Существует ли эквивалентная библиотека или подход кдостичь такого же стиля программирования в Clojure?

Например, как я мог бы написать эквивалент Clojure для приведенного выше примера:

(defn increase [company k]
  (everywhere-in company (transform-map-values :salary #(* % (+ 1 k))))

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

Наиболее близким к этому в Clojure, вероятно, являются функции "in" (связывание, обновление, рассылка).

Эти функции позволяют вам делать глубоко вложенные, точные изменения в clojure. В Haskell нет эквивалента этим функциям, потому что они сильно зависят от динамической типизации.

1 голос
/ 31 января 2015

Их не было, когда этот вопрос был задан впервые, но я считаю, что преобразователи допускают аналогичный стиль программирования.В основном преобразуемые процессы реализуют определенный набор функций, которые преобразователи могут использовать для прохождения по любому трансдуцируемому процессу.

...