计算Clojure中的序列

计算Clojure中的序列,clojure,Clojure,我在4Clojure网站上解决了这个问题,要求我编写一个函数,对序列中的元素进行计数。因为有一次我和Haskell搞砸了,我知道使用fold可能是实现这一点的方法。在阅读了相关内容后,我逐渐认识到我应该使用reduce来达到同样的目的。以下是我提交的答案: #(reduce inc 0 %) 这背后的原因是迭代列表,每次调用inc时,初始值为0。然而,这是行不通的。该网站抱怨args 2传递给:core$inc的数量错误,因此我尝试在inc周围添加paren: 现在它认为没有参数被传递到inc

我在4Clojure网站上解决了这个问题,要求我编写一个函数,对序列中的元素进行计数。因为有一次我和Haskell搞砸了,我知道使用fold可能是实现这一点的方法。在阅读了相关内容后,我逐渐认识到我应该使用reduce来达到同样的目的。以下是我提交的答案:

#(reduce inc 0 %)
这背后的原因是迭代列表,每次调用inc时,初始值为0。然而,这是行不通的。该网站抱怨args 2传递给:core$inc的数量错误,因此我尝试在inc周围添加paren:

现在它认为没有参数被传递到inc。我在这里做错了什么?

假设列表是

[1 2 3 4]
在第一个示例中,您告诉reduce执行以下操作:

(inc 0 1)
(inc 0 2)
(inc 0 3)
(inc 0 4)
显然,inc在这里被传递了两个参数,而它需要一个参数

在第二次尝试中,您告诉reduce inc将返回一个函数,然后该函数将与值和列表一起使用。inc是对inc函数的零参数调用

要减少第一个参数,需要一个函数,该函数接受两个值,并返回递增一的第一个值。

假设列表为

[1 2 3 4]
在第一个示例中,您告诉reduce执行以下操作:

(inc 0 1)
(inc 0 2)
(inc 0 3)
(inc 0 4)
显然,inc在这里被传递了两个参数,而它需要一个参数

在第二次尝试中,您告诉reduce inc将返回一个函数,然后该函数将与值和列表一起使用。inc是对inc函数的零参数调用

第一个参数需要减少的是一个函数,它接受两个值并返回递增一的第一个值

请不要在clojure中使用parens来指导编译器/解释器。在clojure中,每一个括号都很重要,这样你就可以调用一个没有参数的函数

现在,看一看

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

所以当你写作的时候

(reduce inc 0 [1 2 3])
实际发生的是

(inc 
   (inc 
      (inc 0 1) 2) 3)
正确的功能可能看起来像

#(reduce 
    (fn [c _] (inc c))
     0 %)
所以我试着在公司周围添加parens

请不要在clojure中使用parens来指导编译器/解释器。在clojure中,每一个括号都很重要,这样你就可以调用一个没有参数的函数

现在,看一看

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

所以当你写作的时候

(reduce inc 0 [1 2 3])
实际发生的是

(inc 
   (inc 
      (inc 0 1) 2) 3)
正确的功能可能看起来像

#(reduce 
    (fn [c _] (inc c))
     0 %)

另一种方法是将序列转换为Java数组并调用alength函数:

#(alength (to-array %))

另一种方法是将序列转换为Java数组并调用alength函数:

#(alength (to-array %))
Clojure的reduce可以被认为类似于haskell的左折叠函数foldl。 haskell计算列表xs中项目的方法如下

福尔德常数+10 x

这可以更好地理解为foldl\acc\uux->acc+10xs

其思想是增加fold函数中的第一个操作数,因此我很想把它写成

减少inc%1 0 xs

但这是错误的,因为匿名函数的arity由表达式中的确定,我们的fold函数的arity必须为2

因此,一个聪明的解决方法: reduce inc first%&0xs

Clojure的reduce可以被认为与haskell的左折叠函数foldl类似。 haskell计算列表xs中项目的方法如下

福尔德常数+10 x

这可以更好地理解为foldl\acc\uux->acc+10xs

其思想是增加fold函数中的第一个操作数,因此我很想把它写成

减少inc%1 0 xs

但这是错误的,因为匿名函数的arity由表达式中的确定,我们的fold函数的arity必须为2

因此,一个聪明的解决方法:
reduce inc first%&0 xs

我也在学习clojure时查看问题列表。找到了这个问题的答案:

reduce + (#(for [o %] 1))

我也一直在学习clojure。找到了这个问题的答案:

reduce + (#(for [o %] 1))

当coll包含数字而不是字符时工作。@RossPresser哦,我忘记了初始值,现在已修复:reduce fn[c_]inc c 0[\a\b\c]将产生3。当coll包含数字而不是字符时,感谢您。@RossPresser哦,我忘记了初始值,现在已修复:reduce fn[c\u]inc c 0[\a\b\c]将产生3。谢谢