我的问题非常类似于这个问题:如何在Clojure中评估一系列不纯函数?但是,如何不是不纯函数,我如何评估纯函数的序列并将结果作为另一个序列?
让我们假设我们有一个函数向量,如:
[#(str "a" "b") #(str "c" "d") #(str "e" "f")]
Run Code Online (Sandbox Code Playgroud)
我们需要这样的输出:
("ab" "cd" "ef")
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西:
(map eval [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
Run Code Online (Sandbox Code Playgroud)
但它只返回一个函数引用向量.
有多种方法可以满足您的要求.这取决于你是否想要一个懒惰的序列(你可能想要懒惰,因为没有副作用,但如果你想要缓存的密集计算你可能想要不懒),或者如果你想要一个矢量作为输出(与您的输入相同).我会尝试按照你的尝试去做.
使用eval的地图对每个fn执行以下操作:
user=> (eval #(str 1))
#<user$eval1332$fn__1333 user$eval1332$fn__1333@38747597>
Run Code Online (Sandbox Code Playgroud)
但是你需要以下内容:
user=> (eval (#(str 1)))
"1"
Run Code Online (Sandbox Code Playgroud)
您希望eval应用fn,即:fn应该是列表的第一个元素.我们把它放在一个列表中:
user=> (map (comp eval list) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Run Code Online (Sandbox Code Playgroud)
凉.但是,您可能希望使用apply而不是eval:
user=> (apply #(str 1))
; ArityException Wrong number of args (1)
Run Code Online (Sandbox Code Playgroud)
UPS!它失败了.apply没有0-arity重载,但我们可以传递一个空列表:
user=> (apply #(str 1) ())
"1"
Run Code Online (Sandbox Code Playgroud)
好多了.我们用地图做吧:
user=> (map #(apply % ()) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Run Code Online (Sandbox Code Playgroud)
或者更好的是,鉴于你的函数没有任何参数,你最好按照@Magos的建议去做:
user=> (map #(%) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Run Code Online (Sandbox Code Playgroud)