【问题标题】:Clojure pattern matching for vectors向量的 Clojure 模式匹配
【发布时间】:2013-11-21 04:17:58
【问题描述】:

我想编写一个函数,它接受向量 [& x] 并对元素对应用测试。输出测试认为相同的元素向量和 nil 元素向量。

我的第一个想法是获取向量并将它们展平。

(defn soup [& x]
    (vec (flatten x))

然后应用诸如相同的测试?否定?或类似的规定。正是在模式匹配的时候,我一直在尝试组装输出。

例如) 输入1:[:a :b :c :a :b :c]

输出 1:[[:a :a] [:b :b] [:c :c]]

输入 2:[[:a :b :c] [:a :b :c]]

输出 2:[[[:a :b :c] [:a :b :c]]]

如果输入 2 首先被展平,它会返回输出 1。

【问题讨论】:

  • 嗨@Alex,你能提供一个输出示例吗?
  • 扁平化几乎不是你想要的; (汤:a:b:c),(汤[:a] [:b:c]),(汤[:a:b]:c)和(汤[[[:a:b:c]] ]) 都会根据该定义返回相同的结果

标签: clojure clojure-contrib


【解决方案1】:

将 sort 和 partition-by 结合起来会接近您的要求吗?

(->> [:a :b :c :a :b :c] sort (partition-by identity))
((:a :a) (:b :b) (:c :c)) 

(->> [[:a :b :c] [:a :b :c]] sort (partition-by identity))
(([:a :b :c] [:a :b :c]))

如果你需要它们成为向量之后:

(->> [:a :b :c :a :b :c] sort (partition-by identity) (map vec) vec)
[[:a :a] [:b :b] [:c :c]]

(->> [[:a :b :c] [:a :b :c]] sort (partition-by identity) (map vec) vec)
[[[:a :b :c] [:a :b :c]]]

【讨论】:

  • 如何修改此代码以获取诸如 [:a :a :b :b :b :c :c :c :a :a] 之类的向量并输出 [[:a :a ] [:b :b :b] [:c :c :c] [:a :a]。从而将输入的相同元素的运行作为向量输出。
  • 只需删除对排序的调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多