1

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

我究竟做错了什么?

4

2 回答 2

1

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

(define (rd data)
 (map (lambda (x)
        (if (not (null? x)
            (cadr x)
            x))
      data))
于 2013-04-04T02:10:06.970 回答
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)))
于 2013-04-04T02:37:00.057 回答