我有一些功能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))
?
答案 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)
。