显示列表中元素的最后一次出现

Show last appearance of element in list

我想显示给定列表中某个元素的最后一次出现。例如:对于列表 '(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: given procedure does not accept 2 arguments"

这就是我只用递归解决它的方法,但我只想使用 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)))))

我认为您误解了折叠在 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)