clojure - 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)))
为什么?(我该如何解决这个问题?)
解决方案
您的倒数第二个版本“几乎”有效。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))
推荐阅读
- javascript - 在 PHP 中更新和传递值
- react-native - 如何根据 React Native 中的用户搜索从 api 获取数据?
- javascript - 解释 Vigenère 密码的功能
- python-3.x - 如何在 Windows 中在 MSYS2 之外运行 GTK3 Python3 脚本
- c++ - C++ cout 行为/执行顺序
- angular - Angular 7 在 *ngFor 列表中显示和隐藏孩子
- php - 当有出口时如何在php的foreach循环中传递一个值
- r - 如何根据 R 中的列表从矩阵中删除列?
- php - 转换多用户登录
- tableau-api - 如何仅使用每个类别的特定行数进行计算?