Классическая книга The Little Lisper (The Little Schemer) основан на два больших идеяхРекурсия запаха (в идиоматическом Clojure) из-за молнии и HOF?
- Вы можете решить большинство проблем рекурсивным образом (вместо использования петель) (если у вас есть хвост вызов Optimization)
- Lisp является большим потому что он легко реализуется сам по себе.
Теперь можно подумать, что это относится ко всем языкам Lispy (включая Clojure). Беда в том, что книга является артефактом ее времени (1989), вероятно, до Functional Programming с Higher Order Functions (HOFs) была тем, что у нас есть сегодня (или, по крайней мере, считалось приемлемым для студентов).
Преимущество рекурсии (по крайней мере частично) заключается в простоте обхода вложенных структур данных, таких как ('a 'b ('c ('d 'e)))
.
Для example:
(def leftmost
(fn [l]
(println "(leftmost " l)
(println (non-atom? l))
(cond
(null? l) '()
(non-atom? (first l)) (leftmost (first l))
true (first l))))
Теперь Functional Zippers - мы имеем нерекурсивный подход к пересекающему вложенным структурам данных, и можем пересекать их, как мы бы любые ленивые структуры данных. Для example:
(defn map-zipper [m]
(zip/zipper
(fn [x] (or (map? x) (map? (nth x 1))))
(fn [x] (seq (if (map? x) x (nth x 1))))
(fn [x children]
(if (map? x)
(into {} children)
(assoc x 1 (into {} children))))
m))
(def m {:a 3 :b {:x true :y false} :c 4})
(-> (map-zipper m) zip/down zip/right zip/node)
;;=> [:b {:y false, :x true}]
Теперь, кажется, можно решить любую вложенную список обхода проблемы либо с:
zipper
, как указано выше, илиzipper
ходящий структуру и возвращает набор ключи, которые позволят вам изменить структуру, используяassoc
.
Предположения:
- Я предполагаю, что структуры данных, конечно, что фиксированный размер, и полностью известны до обходе
- Я за исключением сценария источника данных потокового видео.
Мой вопрос: Является рекурсивным запахом (в идиоматическом Clojure) из-за молнии и HOF?
Это может быть запах, но не один неприятный для конкретных проблем. Например, обработка неструктурированного (или неоднозначного) ввода для создания чего-то структурированного и детерминированного. –
Не могли бы вы дать ответ и привести пример? Это звучит как-то от Парадигм Норвига по искусственному интеллекту. – hawkeye