ClojureScript 中 Wolfram 语言的 Fold 等价物是什么?

What is the equivalent of Wolfram Language's Fold in ClojureScript?

Wolfram 语言又名 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

ClojureScript 中 Wolfram 语言的 Fold 等效于什么?

给你:

(reduce 
  (fn [r x] (+ (* r 10) x)) 
  0 [1 2 3 4])

数学函数折叠有几种风格,向左折叠和向右折叠,这在应用函数的方向上有所不同。 Clojure 的 reduce 向左折叠

另外,在 clojure 中,与其他具有 fold 的语言相比,reducing 函数将使用几个不同数量的参数调用。

首先让我们定义一个函数,告诉我们它是 args

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

如果您的列表为空,则不带参数调用缩减函数以生成 "identity" 值。对于加法,身份为零,对于 / 为 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