Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 重复将值从序列映射到参数列表的最佳方法?_Clojure - Fatal编程技术网

Clojure 重复将值从序列映射到参数列表的最佳方法?

Clojure 重复将值从序列映射到参数列表的最佳方法?,clojure,Clojure,对于noob的问题很抱歉,但是有没有一种好方法可以从这样的序列中解构值 (somefunc [[a b c] [1 2 3 4 5 6 7 8 9]] (prn a b c)) ..在序列耗尽之前分配a b c值,让我调用args上的函数?doseq需要大小合适的分区 (doseq [[a b c] (partition 3 [1 2 3 4 5 6 7 8 9])] (prn a b c)) 输出: 1 2 3 4 5 6 7 8 9 这正是我想要的,但似乎应该有一种方法可以直接做到这一点

对于noob的问题很抱歉,但是有没有一种好方法可以从这样的序列中解构值

(somefunc [[a b c] [1 2 3 4 5 6 7 8 9]] (prn a b c))
..在序列耗尽之前分配a b c值,让我调用args上的函数?doseq需要大小合适的分区

(doseq [[a b c] (partition 3 [1 2 3 4 5 6 7 8 9])] (prn a b c))
输出:

1 2 3 4 5 6 7 8 9

这正是我想要的,但似乎应该有一种方法可以直接做到这一点,而不必指定分区。我找到了一个使用循环/重现的解决方案,但它的代码要多得多,而且显然不惯用。做这件事的好方法是什么?谢谢

(defn some-func
  [[a b c & rest :as all]]
  (prn a b c)
  (prn rest)
  (prn all)

user> (some-func [1 2 3 4 5 6 7])
1 2 3
(4 5 6 7)
[1 2 3 4 5 6 7]

阅读有关销毁的更多信息:

使用映射和分区:

(map prn (partition 3 [1 2 3 4 5 6 7 8 9]))

分区+映射是您所需要的全部。了解多伦、多塞克和多尔:


另一种使用循环分解的低级别解决方案:

user=> (def coll [1 2 3 4 5 6 7 8 9 10]) #'user/coll user=> (loop [[a b c & more] coll] user=* (when a user=* (prn a b c) user=* (recur more))) 1 2 3 4 5 6 7 8 9 10 nil nil nil 用户=>(def coll[1 2 3 4 5 6 7 8 9 10]) #'用户/coll 用户=>(循环[[a b c&more]coll] 用户=*(当 用户=*(prn a b c) 用户=*(重复更多次))) 1 2 3 4 5 6 7 8 9 10零零零 无
或者在最后一个完整的三元组后,使用c退出。

谢谢!我现在明白了,这个特定的问题不算是“解构”,因为输入向量没有结构。分区调用为我创建了要匹配的结构。我希望有一些核心或contrib函数可以完全实现我的“somefunc”想要实现的功能,但它似乎并不存在。递归解决方案看起来相当干净。再次感谢。这和分区和映射是一样的。@edbond自然有不同的方法来解决任何给定的问题。否决票通常意味着答案有根本性的错误,你能详细说明你和我的问题是什么吗?我不喜欢重新实现核心函数,这不是惯用的方法。你可能想使用
分区所有
,而不是
分区
,否则,如果集合的长度不能除以3,则会丢失值。
user> (dorun (map #(apply prn %) (partition 3 [1 2 3 4 5 6 7 8 9])))
1 2 3
4 5 6
7 8 9
nil
user=> (def coll [1 2 3 4 5 6 7 8 9 10]) #'user/coll user=> (loop [[a b c & more] coll] user=* (when a user=* (prn a b c) user=* (recur more))) 1 2 3 4 5 6 7 8 9 10 nil nil nil