【问题标题】:Why I'm getting a list instead of a vector?为什么我得到一个列表而不是一个向量?
【发布时间】:2014-11-26 04:38:44
【问题描述】:

所以,我试图以这种方式转换向量 x 的每个元素:x[i]--> 1-(1/x[i])

(defn change[x]
  (fn [i]
    (assoc x i (- 1 (/ 1 (get x i))))
    )
  (range 0 (* (count x) 1))
  )

我正在使用 assoc 替换向量的每个元素,我应该得到一个包含更改的向量,但我得到的是一个列表。

例如 用户>(更改 [21 32 23 34])

(0 1 2 3)

但我应该得到一个向量:v

【问题讨论】:

    标签: vector clojure functional-programming lisp


    【解决方案1】:

    你提供的函数代码没有使用本地匿名函数,可以大大重构。

    这是您使用 cmets 的原始函数。

    (defn change[x]
    
      ;; start unused anonymous
      (fn [i]
        (assoc x i (- 1 (/ 1 (get x i)))))
      ;; end unused anonymous
    
      ;; start/end gen list of ints
      (range 0 (* (count x) 1)))
    

    这大概就是你的意思

    (defn change [coll]
      (mapv #(- 1 (/ 1 %)) coll))
    

    这是输出

    user>  (change [21 32 23 34])
    ;=> [20/21 31/32 22/23 33/34]
    

    【讨论】:

    • 您可以将(/ 1 %)缩写为(/ %)
    【解决方案2】:

    您的代码的作用

    您的原始代码(重新格式化)

    (defn change [x]
      (fn [i] (assoc x i (- 1 (/ 1 (get x i)))))
      (range 0 (* (count x) 1)))
    
    • 然后评估并丢弃函数值
    • 返回range

    所以你可以省略fn 形式并将其简化为

    (defn change [x]
      (range 0 (* (count x) 1)))
    

    这反过来又减少到

    (defn change [x]
      (range (count x)))
    

    例如,

    (change [:whatever :I :choose :to :put :here])
    ;(0 1 2 3 4 5)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多