You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中如何递归使用map对嵌套列表元素执行sqrt运算

错误原因分析

第一种写法错误原因

(map (map sqrt) (list (list 1 4 9) (list 16 25)))
map函数要求第一个入参是可调用的单参数函数,而你写的(map sqrt)是直接触发map调用,且只传入了1个参数,不符合map至少需要「函数+1个遍历序列」的参数规则,运行时会直接抛出参数数量不匹配的错误,无法生成能处理子列表的函数对象。

第二种写法错误原因

(map (fn [x] (map sqrt x)) (list (list 1 4 9) (list 16 25)))
这个写法的处理逻辑是正确的,问题出在语法不匹配你使用的Lisp方言:

  • 如果你使用的是Scheme/Common Lisp:匿名函数的定义关键字不是fn,参数声明也不支持方括号[],错误语法会直接导致解析失败无法运行。
  • 如果你使用的是Clojure:该写法语法和逻辑都正确,运行后会返回((1 2 3) (4 5)),如果和你预期的((1 2 3)(4 5))不符,只是因为Lisp标准输出会在两个子列表之间加空格,属于格式展示差异,数据结构本身完全符合要求。
正确实现

根据你使用的Lisp方言选择对应写法即可:

  1. Scheme 版本
(map (lambda (x) (map sqrt x)) (list (list 1 4 9) (list 16 25)))
  1. Common Lisp 版本
(map 'list (lambda (x) (map 'list #'sqrt x)) (list (list 1 4 9) (list 16 25)))
  1. Clojure 版本
;; 写法1:匿名函数写法(和你第二种写法逻辑一致)
(map (fn [x] (map sqrt x)) (list (list 1 4 9) (list 16 25)))

;; 写法2:函数组合简写,更贴合你第一种写法的思路
(map (partial map sqrt) (list (list 1 4 9) (list 16 25)))

内容的提问来源于stack exchange,提问作者geodude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:15:03