На языке Wolfram Language, также известном как Mathematica (Lisp)

Fold[g, 0, {a,b,c}]

Оценивает

g[g[g[0,a],b],c]

Так когда

f[x_,y_]:=10 x + y

Тогда

Fold[f, 0, {1,2,3,4}]

Оценивается как (создает число из цифр)

1234

Что эквивалентно Fold языка Wolfram Language в ClojureScript?

1
nilo de roock 10 Май 2016 в 21:57

2 ответа

Лучший ответ

Математическая функция сгибается в нескольких вариантах сгиба влево и вправо, которые различаются по направлению применения функции. Уменьшение Clojure складывается влево

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

Сначала давайте определим функцию, которая сообщает нам, что это аргументы

user> (defn ++ [& args]
        (println "++ called with" args)
        (apply + args))
#'user/++

Если ваш список пуст, функция сокращения вызывается без аргументов для получения значения «идентичности». для сложения идентичность равна нулю, для / - 1 и т. д.

user> (reduce ++ [])
++ called with nil
0

Для одного списка элементов он вообще не вызывается

user> (reduce ++ [1])
1

А для остальных случаев он вызывается с двумя аргументами и применяет функцию, как если бы это был ассоциированный слева оператор (в языках inflix) или просто простой вызов старой функции в lisp.

user> (reduce ++ [1 2])
++ called with (1 2)
3
user> (reduce ++ [1 2 3])
++ called with (1 2)
++ called with (3 3)
6
2
Arthur Ulfeldt 10 Май 2016 в 20:52

Ну вот:

(reduce 
  (fn [r x] (+ (* r 10) x)) 
  0 [1 2 3 4])
2
Fabricator 10 Май 2016 в 19:09