2015-01-02 3 views
24

Когда я надел свою шляпу C, я думаю, что, возможно, идиоматический Clojure просто выполняет простую вещь и проверяет возвращаемые значения.Идиоматическая обработка ошибок в Clojure

Когда я надел свою шляпу Java (неохотно, я должен добавить), я думаю, что, поскольку Clojure работает на JVM, естественным путем должно быть использование исключений JVM.

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

Так какой же идиоматический способ обработки ошибок в программе Clojure?

+1

Чувствуется, что любая монада принадлежит к ядре Clojure. Просто бросая исключение, которое, как мне кажется, типично, похоже на возврат к императивному способу делать вещи. – Mario

ответ

15

Ошибка обработки ошибок Clojure - это, как правило, исключение JVM (непроверенный).

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

Для альтернативы, которая позволяет обрабатывать ошибки в стиле erlang, вы должны посмотреть на dire. Это blog post дает хороший обзор рационального для страшного, а также обзор механизмов обработки ошибок Clojure и недостатков.

4

Для очень функционального подхода, взглянуть на cats, который соответствовал бы «какому-то монадического строительству»:

Теория Категории и алгебраическим абстракции для Clojure и ClojureScript. http://funcool.github.io/cats/latest/

Пример взят из их документации:

(require '[cats.core :as m]) 
(require '[cats.monad.maybe :as maybe]) 

(m/mappend (maybe/just [1 2 3]) 
      (maybe/nothing) 
      (maybe/just [4 5 6]) 
      (maybe/nothing)) 

Вы можете видеть, что nothing несколько эквивалентна nil, за исключением того, вы не должны проверить что-либо вручную.

+0

Как Хаскеллер Я одобряю подход монады «Maybe» от faaaar, но я не думаю, что это идиоматический Clojure. – MasterMastic

+0

Я играл только в реплике с кошками, но знаю, что некоторые люди используют его в производстве. Существует также https://github.com/uncomplicate/fluokitten/ и, возможно, даже https://github.com/bwo/monads, но есть много библиотек обработки ошибок (например, ужасный и рогающийся), так что это определенно чувствует как что-то, что можно улучшить на основном языке. – nha

Смежные вопросы