0

我有一些函数func,想将它应用到一个列表上lst,所以我使用了,map但我需要用其他函数评估列表的第一个和最后一个元素func2

所以基本上我想要这个:

(map (lambda (x)
       (cond [(isBeginningOfList? lst) (func2 x)]
             [(isEndOfList? lst) (func2 x)]
             [else (func x)]))
     lst)

显然这是行不通的。

我怎样才能实现这个功能?我能以某种方式获得每个列表条目的键吗?喜欢lambda(key,val)然后比较(equal? key 0)/ (equal? key (length lst))

4

2 回答 2

4

有和你描述的for/list那样in-indexed

(define (f lst f1 f2)
  (define last (sub1 (length lst)))
  (for/list (((e i) (in-indexed lst)))
    (if (< 0 i last)
        (f1 e)
        (f2 e))))

然后

> (f '(1 2 3 4 5) sub1 add1)
'(2 1 2 3 6)
于 2014-12-14T17:11:35.703 回答
3

您可以map在除第一个和最后一个元素之外的所有元素上使用 a 并分别处理这两个元素。通过这种方式,您可以避免对每个元素进行的比较。

(define special-map
  (λ (lst f1 f2)
    (append (list (f1 (car lst)))
            (map f2 (drop-right (cdr lst) 1))
            (list (f1 (last lst))))))

例子

让我们尝试增加第一个和最后一个元素并减少所有其他元素。

> (special-map '(1 2 3 4 5) add1 sub1)
'(2 1 2 3 6)

稍后编辑

我改变(take (cdr lst) (- (length lst) 2))(drop-right (cdr lst) 1)

于 2014-12-14T17:05:39.583 回答