如何评估Clojure中的纯函数序列

slh*_*sen 2 lisp clojure

我的问题非常类似于这个问题:如何在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)

但它只返回一个函数引用向量.

nbe*_*ger 9

有多种方法可以满足您的要求.这取决于你是否想要一个懒惰的序列(你可能想要懒惰,因为没有副作用,但如果你想要缓存的密集计算你可能想要不懒),或者如果你想要一个矢量作为输出(与您的输入相同).我会尝试按照你的尝试去做.

使用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)


Mag*_*gos 5

你可以使用(fn [f] (f))#(%)在你的map.