Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅映射Clojure中的一组指定值_Clojure - Fatal编程技术网

仅映射Clojure中的一组指定值

仅映射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) 这是我第一次尝试;天真的命令式方法:

我已经和这个小Clojure片段搏斗了一段时间,但一直觉得有一种更惯用、更简单的方法

期望的行为;将“1”->转换为true,“0”->转换为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)))