gpt4 book ai didi

dictionary - Clojure 交换!不在 let 绑定(bind)中的映射函数内部工作

转载 作者:行者123 更新时间:2023-12-04 01:52:45 25 4
gpt4 key购买 nike

我有两个序列进行比较,我需要将比较结果保存在一个映射中,第一个序列中的数据用作键,第二个序列中的数据用作值。这是有效的示例代码

(def myAtom  (atom {}))

(map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
[1 2 3] [4 5 3])

(prn @myAtom) ; ==> {3 3}

然而,将上面“相同”的东西放入一个 let 绑定(bind)后,它就不再起作用了

(let  [ myAtom  (atom {})]    
(map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
[1 2 3] [4 5 3])
(prn @myAtom)) ;;==> {} empty???

那么问题来了,在 let 绑定(bind)中,myAtom 发生了什么?怎么不见了?

最佳答案

map 是从序列中生成惰性序列,而你需要的是对序列中的每个项目进行特定操作(即交换),因此你需要使用 doseq

编辑:(根据@mobyte 建议更新)

(let  [myAtom  (atom {})
a [1 2 3]
b [4 5 3]]
(doseq [[x y] (map vector a b)]
(if (== x y) (swap! myAtom assoc x y )))
(prn @myAtom))

您的第一个示例之所以有效,是因为您在 REPL 中执行了每个表达式,这使得 map 操作执行其惰性操作。

我见过很多人尝试使用 map 来做这样的某些操作,map 应该只用于一个目的,即将一个序列映射到另一个序列而没有任何副作用操作。

关于dictionary - Clojure 交换!不在 let 绑定(bind)中的映射函数内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15332320/

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