我正在解决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中,每个括号都计数,这样你只需调用一个零参数的函数.
现在,看一下关于reduce的clojure 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)
归档时间: |
|
查看次数: |
4113 次 |
最近记录: |