Я иногда считаю удобным в Clojure определять уменьшенные версии функций, которые возвращают частичную функцию, например.Определение парциальных функций с уменьшенной arity
(defn prefix
([pre string]
(str pre ":" string))
([pre]
(fn [string]
(prefix pre string))))
Это означает, что вы можете сделать что-либо:
(prefix "foo" 78979)
=> "foo:78979"
((prefix "foo") 78979)
=> "foo:78979"
Это кажется вполне Haskell-иш и исключает необходимость partial
для создания частичных функций.
Но он считается хорошим стилем кодирования/дизайном API в Lisp?
Это каррирование, да? Кажется полезным. И я думаю, что интерфейс здесь может быть улучшен. Было бы неплохо, если бы вы могли сделать эту технику общей; то есть для функций со всеми ключевыми словами, если вы вызываете эту функцию с неполным набором ключевых слов, она возвращает закрытие, которое принимает все оставшиеся ключевые слова. Если все ключевые слова потребляются, вы получаете значение функции. Я мог видеть, что это используется в качестве метода оптимизации. –
Я думаю, что все еще идеоматично, если вы называете вас частичными для удобочитаемости, когда вы определяете их так: (def prefix (partial ...)). Таким образом, это имеет и следующее: имя для ссылки, и оно явное.Обратите внимание, что теперь вы не используете defn, но def-partial создает функцию для вас. – KIMA