仅映射Clojure中的一组指定值
我已经和这个小Clojure片段搏斗了一段时间,但一直觉得有一种更惯用、更简单的方法 期望的行为;将“1”->转换为true,“0”->转换为false。否则按原样返回参数:仅映射Clojure中的一组指定值,clojure,Clojure,我已经和这个小Clojure片段搏斗了一段时间,但一直觉得有一种更惯用、更简单的方法 期望的行为;将“1”->转换为true,“0”->转换为false。否则按原样返回参数: (= (mapper {:column 0} ["monkey" "stuff"]) "monkey") (= (mapper {:column 0} ["1" "stuff"]) true) (= (mapper {:column 0} ["0" "stuff"]) false) 这是我第一次尝试;天真的命令式方法:
(= (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
键是标准键,您可以使用
工作原理: Hashmaps可以被视为函数,其第一个参数是键,用于检索值。此表单还接受第二个可选参数,该参数在hashmap不包含键时返回
{c :column :or {c 0}}
此解构表单使用:column
作为传递到函数第一个参数的项的键。(在本例中,这是您的{:column 0}
hashmap。)当:column
键不存在或参数不是有效集合(例如nil、数字、日期等)时,可选的:or
关键字允许使用默认值c
现在将包含:列
键的值或默认值0
{item c}
由于作为第二个参数传递的集合是可索引的,因此可以使用前面使用的相同形式。在前面的分解表单中命名的var,c
,包含:column
的值,它可以用于索引到第二个参数中,并将结果值分配给项
高尔夫代码: 如果可以保证输入参数格式,则可以进一步简化为:
(fn [{i :column} {x i}] ({"1" true "0" false} x x))
我会选择更长(更可读?)的实现:
(defn mapper [{c :column} row]
(let [v (row c)]
(condp = v
"1" true
"0" false
v)))
为什么不做一些简单的事情,比如cond或core.match?只是一个旁注:第一个例子的必要性是什么?对我来说,“命令式”意味着“使用副作用”。(但我是Clojure的新手,所以可能我误解了代码的作用。)例如@dAni的解决方案不是必须的<例如,让和如果不是必需的。“Functional”在狭义上是指函数式编程中常见的方法。我想你是在要求用“功能型”的方式做你想做的事——这没什么错。但在我看来,这种风格的反面并不是“必须的”。(
let
可被视为匿名函数调用。)
(fn [{i :column} {x i}] ({"1" true "0" false} x x))
(defn mapper [{c :column} row]
(let [v (row c)]
(condp = v
"1" true
"0" false
v)))