我有一个哈希图。我希望遍历这些值,并根据值的类型替换每个值。如果值是整数,则将其替换为true
,如果不是,则将其替换为false
。我希望它返回一个新的散列映射,每个值都更新为true或false。
(defn my-function [hash-map]
(loop [hash-map hash-map]
(for [value (vals hash-map)]
(if (= Integer (type value))
(recur (assoc hash-map key true))
(recur (assoc hash-map key false))))))
这是行不通的,因为Clojure Can only recur from tail position
,但这就是我想要做的。有没有什么有效的方法可以做到这一点?if-let
和update-in
看起来像是潜在的解决方案,但我不太理解它们。
发布于 2013-01-30 15:32:01
(reduce-kv (fn [m k v] (assoc m k (= Integer (type v)))) {} m)
或者更短,如果你喜欢的话:
(reduce-kv #(assoc %1 %2 (= Integer (type %3))) {} m)
并保持映射类型(散列与排序):
(reduce-kv #(assoc %1 %2 (= Integer (type %3))) (empty m) m)
注意:最后一个不适用于记录。
发布于 2013-01-30 19:51:39
您概述的操作--独立地转换映射中的每个值--实际上已经在the Functor module中实现了。
要使用它,您需要实现转换单个值的函数,然后在您的地图上使用fmap
:
(fmap your-function your-map)
(不要被fmap这个名称所误导--这个操作不是特定于fmap的。因为它是一个泛型函数,所以它适用于任何具有函数器实例的对象,该函数器实例还包括列表、集合和向量)。这是一个保留结构的操作:不会更改任何键,不会添加新键,也不会删除任何键。
如果您希望避免使用泛型函数,只需查看the implementation
(defmethod fmap clojure.lang.IPersistentMap
[f m]
(into (empty m) (for [[k v] m] [k (f v)]))) ;;; <== the important part!!
在那里f = your-function
和m = your-map
。
此库已被移动(是否正在移动?将被移动?)敬clojure.algo.generic.functor
。更多信息请参见this,源代码请参阅this。
发布于 2013-01-30 14:46:25
(letfn [(map-vals [m f]
(into {} (for [[k v] m]
[k (f v)])))]
(map-vals m #(= Integer (type %))))
https://stackoverflow.com/questions/14597245
复制相似问题