如何解决泛化嵌套调用以使用函数
我正在寻找一种定义函数map-nest
的好方法,该函数执行可以通过额外的嵌套值进行自定义的嵌套映射操作:
(map-nest 0 inc [1 2 3 4 5])
; 0th LEVEL
; expands to (map inc [1 2 3 4 5])
=> '(2 3 4 5 6)
(map-nest 1 inc [[1 2 3] [4 5]])
; 1st LEVEL
; expands to (map (fn [x] (map inc x)) [[1 2 3] [4 5]])
=> '((2 3 4) (5 6))
(map-nest 2 inc [[[1 2] [3 4]] [[5]]])
; 2nd LEVEL
; expands to
; (map (fn [y] (map (fn [x] (map inc x)) y))
; [[[1 2] [3 4]] [[5]]])
=> '(((2 3) (4 5)) ((6)))
; and so on
;
有写这个的好方法吗?
解决方法
最简单的方法是一些递归映射功能,也许是这样的:
(defn map-nest [level f data]
(let [f (if (zero? level) f (partial map-nest (dec level) f))]
(map f data)))
user> (map-nest 0 inc [1 2 3 4 5])
;;=> (2 3 4 5 6)
user> (map-nest 1 inc [[1 2 3] [4 5]])
;;=> ((2 3 4) (5 6))
user> (map-nest 2 inc [[[1 2] [3 4]] [[5]]])
;;=> (((2 3) (4 5)) ((6)))
您还可以将嵌套映射视为简化流,其中每个简化映射都从函数开始,每次迭代都生成一个下一级映射:
(defn make-nested-mappers [f]
(rest (iterate #(partial map %) f)))
(defn map-nest [level f data]
((nth (make-nested-mappers f) level) data))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。