Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure conj不更新循环内的向量_Clojure - Fatal编程技术网

Clojure conj不更新循环内的向量

Clojure conj不更新循环内的向量,clojure,Clojure,我在努力自学clojure。这应该是一个简单的函数,它接受一个值并将其前面的每个值相加,然后返回这些值的总和 问题是,在循环函数中,数字没有像我预期的那样用conj修改-数字只是保持一个空向量。为什么呢 (defn sum [number] (do (def numbers (vector)) (loop [iteration number] (if (&

我在努力自学clojure。这应该是一个简单的函数,它接受一个值并将其前面的每个值相加,然后返回这些值的总和

问题是,在
循环
函数中,
数字
没有像我预期的那样用
conj
修改-
数字
只是保持一个空向量。为什么呢

(defn sum                        
  [number]                       
  (do (def numbers (vector))     
    (loop [iteration number]     
      (if (> iteration 0)        
        (conj numbers iteration) 
        (recur (dec iteration))))
    (map + numbers)))
一些提示(不是答案):

  • 不要使用
    do
  • 在函数中使用
    let
    ,而不是
    def
  • 使用由
    conj
    返回的结果,否则它什么也不做
  • 将结果通过
    recur
    返回
此外,
sum
函数忽略其
number
参数

我想你正在混淆
数字
(你想添加的东西的数量)和
数字
(东西本身)。记住

  • 向量(和其他数据结构)知道它们的长度;及
  • 正如下文所述,它们通常被迅速而简洁地处理为 序列,使用
    first
    rest
    代替索引

您正在搜索的代码模式非常常见,已在名为
reduce
的标准高阶函数中捕获。你可以通过……得到你想要的效果

(defn sum [coll] (reduce + coll))

比如说,

(sum (range 10))
;45

有些离题:


如果我是你,我曾经是,我会在网上阅读一些优秀的clojure教程,并附上回复。你可以开始找或者。享受吧

您的功能不起作用主要有三个原因:

  • 您假设conj将更新变量
    numbers
    的值(但实际上它返回绑定到另一个名称的副本)
  • 您使用了类似于经典命令式风格的
    loop/recur
    模式(它的工作原理不同)
  • map的错误使用
缩略图给出了惯用的答案,但以下是您的模式的正确用法:

(defn sum
  [number]
  (loop [iteration number
         numbers []]
    (if (<= iteration 0)
          (reduce + numbers)
          (recur (dec iteration) (conj numbers iteration)))))
(定义和
[数字]
(循环[迭代次数
数字[]]

(如果(
conj
没有修改它的参数,它将返回一个添加了元素的新向量。啊,我明白了,那么我需要重新思考我是如何做到这一点的。谢谢。这有助于向我清楚地解释循环/重现。谢谢。感谢链接。我要查看它们!
(defn sum
  [number]
  (loop [iteration number
         numbers []]
    (if (<= iteration 0)
          (reduce + numbers)
          (recur (dec iteration) (conj numbers iteration)))))