Functional programming 穿过foldr

Functional programming 穿过foldr,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,如何在球拍中跨过这一步?我写了一段代码,它似乎工作得很好。然而,我不明白 (来源:uwaterloo CS 2015年秋季任务09,11月24日到期) 问题是:编写一个函数unique fn,它使用一个列表和一个谓词相等函数并生成相同的列表 根据提供的相等谓词,删除所有重复项。不能使用排序或递归。比如说, (check-expect (unique-fn '(3 1 3) =) '(3 1)) (check-expect (unique-fn '(1 1.05 2 1.2)

如何在球拍中跨过这一步?我写了一段代码,它似乎工作得很好。然而,我不明白

(来源:uwaterloo CS 2015年秋季任务09,11月24日到期)

问题是:编写一个函数
unique fn
,它使用一个列表和一个谓词相等函数并生成相同的列表 根据提供的相等谓词,删除所有重复项。不能使用排序或递归。比如说,

 (check-expect (unique-fn '(3 1 3) =) '(3 1))

 (check-expect (unique-fn '(1 1.05 2 1.2) 
                          (lambda (x y) (> 0.1 (abs (− x y))))) 
              '(1 2 1.2))
这是我的代码,但我不明白如何工作:

(define (unique-fn list-of-elm pred?)
(foldr (lambda (x y)
       (cons x (foldr (lambda (a b) 
               (cond[(pred? x a) b]
                    [else (cons a b)])) empty y)))
     empty list-of-elm))

我真的不知道如何度过这一关。我知道foldr从右边折叠,但这个“嵌套”foldr实际上是如何工作的?有什么想法吗

最好将
foldr
过程参数作为形式参数
(x acc)
而不是
(x y)
,在这种情况下,您正在累积一个列表,因此cons是该过程的适当开口

然而我不认为这是一个foldr,我认为这是一个foldl。如果是foldr,则在调用PRODUDURE之前,acc中会有1.05,保留1.05并抛出1。该逻辑实际上从左向右读取,保留最左侧的重复项,删除右侧的重复项

(define (unique-fn list-of-elm pred?)
 (reverse ;for right result order
   (fold (lambda (acc x)
            (if (member x acc pred?) ;member optionally accepts a predicate
                acc
                (cons x acc)))
         empty 
         list-of-elm)))

最好将
foldr
过程参数作为形式参数
(x acc)
而不是
(x y)
,在这种情况下,您正在累积一个列表,因此cons是该过程的适当开口

然而我不认为这是一个foldr,我认为这是一个foldl。如果是foldr,则在调用PRODUDURE之前,acc中会有1.05,保留1.05并抛出1。该逻辑实际上从左向右读取,保留最左侧的重复项,删除右侧的重复项

(define (unique-fn list-of-elm pred?)
 (reverse ;for right result order
   (fold (lambda (acc x)
            (if (member x acc pred?) ;member optionally accepts a predicate
                acc
                (cons x acc)))
         empty 
         list-of-elm)))

你考虑过使用球拍的步进器吗?在我看来,您的代码应该在其中一种教学语言中运行良好,可能是中间语言。步进器应该显示程序评估的每个步骤。

您考虑过使用Racket的步进器吗?在我看来,您的代码应该在其中一种教学语言中运行良好,可能是中间语言。步进器应该向您显示程序评估的每个步骤。

因为代码中的
foldr
会调用自身。它正在使用递归,并且不符合您问题中所述的要求。
(foldr f z[a,b,…,n])==(f a(f b(…(f n z)))
。因为代码中的
foldr
会调用自身。它正在使用递归,不符合您问题中所述的要求。
(foldr f z[a,b,…,n])==(f a(f b(…(f n z)…)