gpt4 book ai didi

clojure - 在 Clojure 中只映射一组指定的值

转载 作者:行者123 更新时间:2023-12-05 09:23:45 28 4
gpt4 key购买 nike

一段时间以来,我一直在研究这个 Clojure 小片段,但一直觉得还有一种更惯用、更简单的方法。

期望的行为;转换“1”-> 真,“0”-> 假。否则按原样返回参数:

(= (mapper {:column 0} ["monkey" "stuff"]) "monkey")
(= (mapper {:column 0} ["1" "stuff"]) true)
(= (mapper {:column 0} ["0" "stuff"]) false)

这是我的第一次尝试;天真的命令式方法:

(defn mapper 
[attr-map row]
(let [x (row (:column attr-map))
y ({"1" true "0" false} x)]
(if (nil? y)
x
y)))

第二次尝试:

(defn mapper 
[attr-map row]
((comp #({"1" true "0" false} % %) row :column) attr-map))

谁能找到更好的解决方案?

最佳答案

如果 :column 键是标准的,你可以使用 destructuring .

(defn mapper [{c :column :or {c 0}}
{item c}]
({"1" true "0" false} item item))

工作原理:

({"1" true "0" false} item item)

HashMap 可以被视为函数,其第一个参数是一个键,用于检索一个值。此形式还接受第二个可选参数,该参数在散列映射不包含键时返回。

{c :column :or {c 0}}

这种解构形式使用 :column 作为传递给函数第一个参数的项的键。 (在这种情况下,这是您的 {:column 0} HashMap 。)可选的 :or 关键字允许在 :column 键时使用默认值不存在,或者参数不是有效集合(例如 nil、数字、日期等)。 c 现在将包含 :column 键的值或默认值 0。

{item c}

由于作为第二个参数传递的集合是可索引的,您可以使用之前使用的相同形式。在前面的解构形式中命名的 var,c,包含 :column 的值,它可用于索引第二个参数,并将结果值赋给 项目


代码高尔夫:

如果能保证输入参数的格式,还可以进一步简化为:

(fn [{i :column} {x i}] ({"1" true "0" false} x x))

关于clojure - 在 Clojure 中只映射一组指定的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19325073/

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