我正在尝试删除列表中每个子列表中的第一个元素。我需要每个子列表的cdar。我尝试使用地图,但它没有用。我出于某种原因得到了空洞。我应该使用递归吗?
我的代码:
(define (rd data)
(map (lambda (x)
(if (null? x)
(cdar x)))
data))
我想要这个:
'((1 (r (3 4))) (4 (d (5 6)))) -> ((r (3 4)) (d (5 6)))
我做错了什么?
答案 0 :(得分:1)
前面指出的两个错误加上需要处理if
备用错误,解决了:
(define (rd data)
(map (lambda (x)
(if (not (null? x)
(cadr x)
x))
data))
答案 1 :(得分:1)
关于您的代码:传递给map
的过程不必测试元素是否为null
,map
负责该部分。该过程只需要处理将要对每个元素执行的,map
将依次将它应用于列表的每个元素(在这种情况下,元素发生作为子列表)并返回包含结果的列表。
理解上述内容,请注意该过程只需要提取每个子列表的第二个元素。一个更简单的解决方案是写:
(define (rd data)
(map (lambda (x) (cadr x)) data))
...但是这太冗长了,我们依次将cadr
应用于每个元素,而不是其他任何东西,这等同于:
(define (rd data)
(map cadr data))
......甚至更清楚(在Racket中工作):
(define (rd data)
(map second data))
任何方式结果都符合预期:
(rd '((1 (r (3 4))) (4 (d (5 6)))))
=> '((r (3 4)) (d (5 6)))