在Clojure中计算一个序列

Has*_*san 1 clojure

我正在解决4Clojure网站上的问题22,要求我编写一个计算序列中元素的函数.因为我曾经一度搞过Haskell,所以我知道使用fold它可能就是这样做的方法.在阅读完之后,我已经明白我应该reduce为了同样的目的而使用它.这是我提交的答案:

#(reduce inc 0 %)
Run Code Online (Sandbox Code Playgroud)

这背后的原因是迭代列表,并且inc每次调用最初为0的值.但是,这不起作用.该网站抱怨说"错误的args数量(2)传递给:core $ inc".所以我尝试添加parens inc:

#(reduce (inc) 0 %)
Run Code Online (Sandbox Code Playgroud)

现在它认为零参数正在传递给inc.我在这做错了什么?

om-*_*nom 10

所以我尝试在公司附近加入parens ......

不要使用Clojure中括号曾经指导编译器/解释器的目的.在clojure中,每个括号都计数,这样你只需调用一个零参数的函数.

现在,看一下关于reduceclojure doc

如果提供了val,则返回将val应用于val和coll中的第一项的结果,然后将f应用于该结果和第二项等.

所以当你写作

(reduce inc 0 [1 2 3])
Run Code Online (Sandbox Code Playgroud)

实际发生的是

(inc 
   (inc 
      (inc 0 1) 2) 3)
Run Code Online (Sandbox Code Playgroud)

适当的功能可能看起来像

#(reduce 
    (fn [c _] (inc c))
     0 %)
Run Code Online (Sandbox Code Playgroud)