【问题标题】:Clojure, Flatten returns realized = 0Clojure,Flatten 实现的回报 = 0
【发布时间】:2015-09-30 07:05:15
【问题描述】:

这可能是一个常见问题,或者我不应该使用 flatten 但我不完全了解发生了什么?

这个想法是采用二维向量 [[x][y][z]] 并返回一个单维集合(现在不要真正关心什么形式,例如 (x y z)[x y z] 现在都可以。

但是,如果我执行以下操作(subbed 是二维向量:

(let [flat-coll (flatten subbed)                           
      header-less (subvec flat-coll 0 (count flat-coll))]
...
)   

flat-col 的值是realized = 0,我期待它是展平集合的值。

我想这归结为懒惰,有没有“更好”的方法来实现我想要的?

【问题讨论】:

  • 我不确定您要达到的目标。这不是flatten 的用途吗?

标签: clojure


【解决方案1】:

flat-coll 是一个 seq,因为 flatten 返回一个 seq,因此 subvec 不起作用

(take 3 (flatten [ [1] [2] [3] ])) 得到header-less 怎么样

虽然我不完全理解你的目标是什么,因为无论如何你都会得到所有的元素。

也许您想通过(vec (flatten [ [1] [2] [3] ])) 获取向量?

【讨论】:

  • 需要的是vec!谢谢,subvec 是从索引 1 而不是 0 开始的。
【解决方案2】:

如果您只想要一个向量作为结果,您可以使用转换器来展平:

(into [] cat [[2] [3]])
;=> [2 3]

如果你也想摆脱头部:

(into [] (comp cat (drop 1)) [[2] [3] [8]])
;=> [3 8]

【讨论】:

    【解决方案3】:

    如果你不关心vector或者list也可以:

    user=> (apply concat [[:x][:y][:z]])
    (:x :y :z)
    

    返回一个惰性序列。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多