首页 > 解决方案 > Clojure - 递归使用地图

问题描述

如果我有一个列表,我可以使用map一个函数将一个函数应用于列表的每个项目。

(map sqrt (list 1 4 9))

(1 2 3)

我也可以map在列表列表前面使用:

(map count (list (list 1 2 3) (list 4 5)))

(4 5)

现在有没有办法应用sqrt到列表列表中的每个数字?我想从

(list (list 1 4 9) (list 16 25))

并获得

((1 2 3)(4 5))

但是,以下似乎不起作用,

(map (map sqrt) (list (list 1 4 9) (list 16 25)))

也不是以下。

(map (fn [x] (map sqrt x)) (list (list 1 4 9) (list 16 25)))

为什么?(我该如何解决这个问题?)

标签: clojurenested-lists

解决方案


您的倒数第二个版本“几乎”有效。Clojure 没有自动柯里化,因此不是(map sqrt)部分应用程序,而是 返回一个转换器,它接受一个参数并返回一个具有三个不同参数的函数 - 因此在那里运行您的代码将为您返回每个数字列表的函数。(map sqrt)

为了使这项工作,您可以使用partial

user=> (map (partial map sqrt) (list (list 1 4 9) (list 16 25)))
((1 2 3) (4 5))

当然还有强制性的幽灵答案:

user=> (transform [ALL ALL] sqrt '((1 4 9)(16 25)))
((1 2 3) (4 5))

推荐阅读