gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:05 25 4
gpt4 key购买 nike

我的问题与这个非常相似:How to evaluate a sequence of impure functions in Clojure?但是我怎样才能评估纯函数的序列并获得另一个序列的结果,而不是不纯的函数?

假设我们有一个函数向量,例如:

[#(str "a" "b") #(str "c" "d") #(str "e" "f")]

我们需要这样的输出:

("ab" "cd" "ef")

我试过类似的东西:

(map eval [#(str "a" "b") #(str "c" "d") #(str "e" "f")])

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

最佳答案

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

带有 eval 的 map 对每个 fn 执行以下操作:

user=> (eval #(str 1))
#<user$eval1332$fn__1333 user$eval1332$fn__1333@38747597>

但是你想要像下面这样的东西:

user=> (eval (#(str 1)))
"1"

您希望 eval 应用 fn,即:fn 应该是列表的第一个元素。让我们把它放在一个列表中:

user=> (map (comp eval list) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")

很酷。但是您可能想使用 apply 而不是 eval:

user=> (apply #(str 1))
; ArityException Wrong number of args (1)

加油!它失败了。 apply 没有 0 元重载,但我们可以传递一个空列表:

user=> (apply #(str 1) ())
"1"

好多了。让我们用 map 来做:

user=> (map #(apply % ()) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")

或者更好的是,假设你的函数没有参数,你最好按照@Magos 的建议去做:

user=> (map #(%) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])                                                                              
("ab" "cd" "ef")

关于clojure - 如何评估 Clojure 中的纯函数序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com