2014-09-26 3 views
0

Предположения:Является ли сущность Maybe Monad a Proxy для вашей функции?

  • по прокси Я имею в виду в том смысле, обертки, как весной
  • по вашей функции я имею в виду что-то же просто, как (fn [x] (+ x 1))

Рассмотрим следующий from Konrad Hinsen :

(defn f [x] 
    (let [a x 
     b (inc a)] 
    (* a b))) 

(defn f [x] 
    (domonad maybe-m 
    [a x 
    b (inc a)] 
    (* a b))) 

(defn m-bind [value function] 
    (if (nil? value) 
     nil 
     (function value))) 

Теперь преимущество в том, что если значение равно nil, то m-bind возвращает nil, а остальная часть вычисления никогда не вызывается.

Мой вопрос: Является ли сущность Maybe Monad прокси для вашей функции?

+0

Можете ли вы перефразировать вопрос? Что вы спрашиваете «в конечном счете», «Прокси» и «ваша функция»? –

+0

Я до сих пор не знаю, что такое прокси-сервер, потому что я не знаю Весны. Не могли бы вы уточнить? – Sarien

ответ

0

Clojurians, кажется, предпочитают синтаксические преобразования, такие как some-> резьбу макрос для короткого замыкания на nil, над алгебраическим формализмом, как может быть, монада.

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

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

+0

Не могли бы вы рассказать о своей чистоте? – hawkeye

+0

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

0

Я не уверен, как работают пружинные обертки, но пункт о возможно монады, как описано в этой статье, является то, что вы пишете код, как это:

(defn f [x] 
    (domonad maybe-m 
    [a x 
    b (inc a)] 
    (* a b))) 

И механизмы монады добавляет проверку между линии. Поэтому после каждого из этих утверждений он проверяет, равен ли результат nil, и если так просто возвращает nil и завершает работу.

Таким образом, вы не просто получите нуль, если вы пройдете ноль, но он также работает, если (inc 8) неожиданно возвращает ноль.

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