(Scheme)如何将该函数应用于列表中的每个子列表?

(Scheme)如何将该函数应用于列表中的每个子列表?,scheme,Scheme,我试图删除列表中每个子列表中的第一个元素。我需要每个子列表的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))) 我做错了什么 前面指出的两

我试图删除列表中每个子列表中的第一个元素。我需要每个子列表的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)))

我做错了什么

前面指出的两个错误,加上需要处理
如果
备选方案,请解决:

(define (rd data)
 (map (lambda (x)
        (if (not (null? x)
            (cadr x)
            x))
      data))

关于代码:传递到
map
的过程不必测试元素是否为
null
map
处理该部分。该过程只需处理将对每个元素执行的操作,
map
将依次将其应用于列表的每个元素(在本例中,元素恰好是子列表),并返回一个包含结果的列表

了解以上内容后,请注意,该过程只需要提取每个子列表的第二个元素。一个更简单的解决方案是写:

(define (rd data)
  (map (lambda (x) (cadr x)) data))
。。。但这太冗长了,我们依次对每个元素应用
cadr
,其他什么都没有,这相当于:

(define (rd data)
  (map cadr data))
。。。或者更清晰(适用于球拍):

无论以何种方式,结果都与预期相符:

(rd '((1 (r (3 4))) (4 (d (5 6)))))
=> '((r (3 4)) (d (5 6)))

您需要的值是列表中每个元素的
cadr
。只有当元素为空时,才调用
cdar
。我认为你的测试是反向的,你想在它不为空时提取
cadr
。哦,是的!如果是空的,我忘了把它放进去。我现在明白了。谢谢
(rd '((1 (r (3 4))) (4 (d (5 6)))))
=> '((r (3 4)) (d (5 6)))