Return the second element for every element in a list

佐手、 提交于 2019-12-25 11:57:31

问题


Let's say we have this list '( (4 (1 2)) (5 (5 5)) (7 (3 1)) (1 (2 3)))

I am trying to write smth in Scheme in order to get the second element for every element in the list.. So the result will look like '( (1 2) (5 5) (3 1) (2 3))

I have this code so far..

(define (second  list1)
  (if (null? (cdr list1))
      (cdr (car list1))
      ((cdr (car list1))(second (cdr list1)))))

回答1:


Here's a straightforward solution:

(define (seconds lst)
  (map cadr lst))

In general, when you want to transform every element of a list, map is the way to go.




回答2:


All you need to do is map the built-in function second onto the list lst:

(map second lst)



回答3:


Your error is that you lack an operator, perhaps cons. If you look at the consequent:

((cdr (car list1))(second (cdr list1)))

So Scheme expects (cdr (car list)) to be a procedure since it's in operator position in the form, but since it isn't you get an error. In addition (cdr (car x)) == cdar wont take the second element in every element but the tail of each element. cadar is what you're lookig for.

(define (second  list1)00+
  (if (null? (cdr list1))
      (cons (cadar list1) '())
      (cons (cadar list1) (second (cdr list1)))))

It will fail for the empty list. To fix this you let the consequemt take care of every element and the base case only to stop:

(define (second  list1)
  (if (null? list1)
      '()
      (cons (cadar list1) (second (cdr list1)))))

The result for a list will be the same. There is a procedure called map. It supports several list arguments, but the implementation for one is:

(define (map fun lst)
  (if (null? lst)
      '()
      (cons (fun (car lst)) (map fun (cdr lst)))))

Looks familiar? Both make a list based on each element, but map is generic. Thus we should try to make (fun (car lst)) do the same as (cadar lst).

(define (second lst)
  (map cadr lst)) ; (cadr (car x)) == (cadar x)

There you have it. Chris beat me to it, but I'd like to comment one of the other answers that uses the abbreviation second. It's defined in racket/base and the library SRFI-1, but it's not mentioned in the last Scheme reports. I.e. some implementations might require an extra library to be imported for it to work.



来源:https://stackoverflow.com/questions/19599562/return-the-second-element-for-every-element-in-a-list

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!