我想显示给定列表中元素的最后一个外观。例如:对于列表'(1 1 2 1 3 3 4 3 5 6),结果将是'(2 1 4 3 5 6)
这是我的代码:
(define (func L res)
(if (not (null? L))
(foldl (lambda (e)
(if (not (member e (cdr L)))
(cons e (remove-duplicates-right (cdr L)))
(remove-duplicates-right (cdr L))))
res L)
res))
(define (show-last-app L)
(func L '()))
发生下一个错误:“foldl:给定的过程不接受2个参数”
这是我通过递归解决它的方法但我只想使用foldl或filter而不使用带副作用的函数:
(define (show-last-app L)
(cond
((null? L)
'())
((not (member (car L) (cdr L)))
(append (list (car L)) (show-last-app (cdr L))))
(else (show-last-app (cdr L)))))
答案 0 :(得分:4)
我认为你误解了折叠在Scheme中是如何工作的。这更接近你的目标:
(define (show-last-app L)
(foldr (lambda (e acc)
(if (not (member e acc))
(cons e acc)
acc))
'()
L))
如果你真的,真的必须使用foldl
:
(define (show-last-app L)
(foldl (lambda (e acc)
(if (not (member e acc))
(cons e acc)
acc))
'()
(reverse L)))
无论哪种方式,它都按预期工作:
(show-last-app '(1 2 4 1 5 3 1 6 2))
=> (4 5 3 1 6 2)