(方案)如何将该功能应用于列表中的每个子列表?

时间:2013-04-04 01:58:07

标签: 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)))

我做错了什么?

2 个答案:

答案 0 :(得分:1)

前面指出的两个错误加上需要处理if备用错误,解决了:

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

答案 1 :(得分:1)

关于您的代码:传递给map的过程不必测试元素是否为nullmap负责该部分。该过程只需要处理将要对每个元素执行的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)))