Clojure模式匹配用于向量

3
我想编写一个函数,接受向量[& x]并对元素对进行测试。输出测试结果相同的元素向量和nil元素向量。
我的第一个想法是将这些向量扁平化。
(defn soup [& x]
    (vec (flatten x))

然后应用一个测试,如identical?neg?或类似的内容。在尝试组装输出时,我卡在了模式匹配的点上。
例如: 输入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,你能提供一个输出示例吗? - tangrammer
"flatten" 几乎永远不是你想要的; 基于这个定义,(soup:a:b:c)、(soup [:a] [:b :c])、(soup [:a :b] :c) 和 (soup [[[:a :b :c]]]) 将返回相同的结果。 - noisesmith
1个回答

4
结合排序和按分区进行操作是否接近您所要求的内容?
(->> [: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]]。其中输入的相同元素的连续运行被输出为向量。 - sunspots
仅删除排序调用。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接