定义 Scheme Image 函数

Defining a Scheme Image function

我正在尝试定义一个函数,该函数接受两个输入,其输出将是一个列表,表示该函数下给定子集的图像。我希望它最终看起来像这样:

(image '(1 2 3)  '((5 4) (3 4) (1 4) (2 6))) ----> (6 4)

到目前为止,我写的东西看起来像这样:

(define (image subset-of-domain func-pairs)
   (cond
     ((empty? (first subset-of-domain))
            (null))
     ((equal? (first subset-of-domain) (first (first func-pairs)))
            (rest (first func-pairs))) (else (image (rest subset-of-domain) (rest func-pairs)))))

根据这些输入,image 的输出应该是一个列表,表示该函数下给定子集的图像。另外,我想删除所有重复项,以便一个数字只显示一次(因此示例结果是 (6 4) 而不是 (4 6 4)。

谢谢,我已经坚持了一段时间了。感谢您的帮助。

一个简单的解决方案是根据基本列表函数滚动您自己的 filter/map 帮助程序,然后删除重复项:

(define (image subset-of-domain func-pairs)
  (define (image-helper lst)
    (cond ((null? lst) '())
          ((member (caar lst) subset-of-domain)
           (cons (cadar lst) (image-helper (cdr lst))))
          (else (image-helper (cdr lst)))))
  (remove-duplicates (image-helper func-pairs)))

上面的方法可以正常工作,但不推荐 - 基本上,我们会重新发明轮子。一个更惯用的解决方案是使用(大部分)标准的高阶过程:

(define (image subset-of-domain func-pairs)
  (remove-duplicates
   (map cadr
        (filter (lambda (pair)
                  (member (car pair) subset-of-domain))
                func-pairs))))

如果您的解释器不提供 remove-duplicates 函数,则为 easy to implement one。更好的是,如果您的解释器恰好是 Racket,我们可以使用内置程序编写一个更短的解决方案:

(define (image subset-of-domain func-pairs)
  (remove-duplicates
   (filter-map (lambda (pair)
                 (and (member (first pair) subset-of-domain)
                      (second pair)))
               func-pairs)))