Clojure can';t在速记函数定义中使用向量创建

Clojure can';t在速记函数定义中使用向量创建,clojure,Clojure,我想在函数中创建向量 (map #([first %]) coll_of_tuples) 这就产生了错误 ArityException传递给的参数(0)数目错误:PersistentVector clojure.lang.AFn.throwArity(AFn.java:429) 除了使用列表,还有其他解决方法吗?我正在寻找简短的表示法。如果我需要向量类型,我会按照peter的建议使用(映射(向量(第一%))coll_of tuples)。到目前为止,list似乎是最短的表示法。如果我需要向量类

我想在函数中创建向量

(map #([first %]) coll_of_tuples)
这就产生了错误

ArityException传递给的参数(0)数目错误:PersistentVector clojure.lang.AFn.throwArity(AFn.java:429)


除了使用
列表
,还有其他解决方法吗?我正在寻找简短的表示法。

如果我需要向量类型,我会按照peter的建议使用
(映射(向量(第一%))coll_of tuples)
。到目前为止,
list
似乎是最短的表示法。

如果我需要向量类型,我会使用彼得建议的
(映射(向量(第一%))coll\u元组)
。到目前为止,
列表
似乎是最短的符号。

如果您想要较短的版本,有几个选项:

(map #(-> [(first %)]) coll)

(map #(do [(first %)]) coll)

(map (juxt first) coll)

如果您想要较短的版本,有几个选项:

(map #(-> [(first %)]) coll)

(map #(do [(first %)]) coll)

(map (juxt first) coll)

您还可以为使用
,这与
映射
非常相似,只是依次为序列中的每个元素指定一个符号名:

(for [tuple coll_of_tuples] 
  [(first tuple)])

这并不像其他一些解决方案那样简单,但在某些情况下,最好有一个命名符号,如
tuple
,而不是
%
,您也可以使用
for
,这与
map
非常相似,只是依次为序列的每个元素指定一个符号名:

(for [tuple coll_of_tuples] 
  [(first tuple)])

这并不像其他一些解决方案那样简单,但在某些情况下,最好有一个命名符号,如
tuple
,而不是
%
,我喜欢peter在

(map #(vector (first %)) coll_of_tuples)
或者交替地

(map #(-> % first vector) coll_of_tuples)
或者越来越依赖FP,越来越不依赖fn:

(map (comp vector first) coll_of_tuples)
如果您更愿意将其视为从每个序列中提取第一个1长度序列,则以下是一个更简单的答案:

(map #(take 1 %) coll_of_tuples)

我喜欢彼得在评论中的回答

(map #(vector (first %)) coll_of_tuples)
或者交替地

(map #(-> % first vector) coll_of_tuples)
或者越来越依赖FP,越来越不依赖fn:

(map (comp vector first) coll_of_tuples)
如果您更愿意将其视为从每个序列中提取第一个1长度序列,则以下是一个更简单的答案:

(map #(take 1 %) coll_of_tuples)

这行得通吗?
(映射(向量(第一个%))coll\u的元组)
?是的,行得通。在这种情况下,我不需要向量。令人遗憾的是,其他的速记符号在
#()
中不起作用。要使它们“起作用”,需要改变Clojure语义的可组合性,所以这是好的,而不是可悲的
#()
是函数创建的简写形式。将Clojure语法组合为
#([…])
意味着创建一个向量,然后封装在一个可调用的函数中。您想要的可调用函数是向量构造。该函数是
向量
+彼得的回答说明了你的意思。@AlexMiller我明白为什么那不起作用了。我非常专注于从数据中提取第一个“列”,所以我认为
map\u fn
是行的最终形状。这可能会重复
(map#(vector(first%))coll\u of tuples)
?是的,可以。在这种情况下,我不需要向量。令人遗憾的是,其他的速记符号在
#()
中不起作用。要使它们“起作用”,需要改变Clojure语义的可组合性,所以这是好的,而不是可悲的
#()
是函数创建的简写形式。将Clojure语法组合为
#([…])
意味着创建一个向量,然后封装在一个可调用的函数中。您想要的可调用函数是向量构造。该函数是
向量
+彼得的回答说明了你的意思。@AlexMiller我明白为什么那不起作用了。我非常专注于从数据中提取第一个“列”,因此我认为
map\u fn
是行的最终形状。另一个行的可能副本可以是
(map(comp vector first)…
,而这些都很简洁(我特别喜欢juxt),我发现它们更难一目了然。第一个和第二个版本正是我试图做的事情的简洁版本,并且满足了
map\u fn
@AlexMiller我认为
juxt
更令人困惑,因为只考虑了一个值,即没有并置。另一个可能是
(map>)(comp vector first)…)
虽然这些都很简洁(我特别喜欢juxt),我发现它们更难一目了然。第一个和第二个版本正是我试图做的事情的简洁版本,并且满足了
map\u fn
@AlexMiller的要求。我认为
juxt
更令人困惑,因为只考虑了一个值,即没有并列。