球拍:用键/迭代映射?

时间:2014-12-14 17:01:01

标签: indexing key scheme racket map-function

我有一些功能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))

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

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

(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)