与作业问题的抽象结合

时间:2019-10-18 00:47:53

标签: racket

练习4有时我们想按某个属性对项目进行分类。例如,假设我们对杯子有以下定义:

(define-struct cup [oz color material])

; A Cup is a (make-cup NonNegNumber String String)
; and represents a cup's capacity in fluid ounces, color, and material

(define CUP1 (make-cup 10 "brown" "wood"))
(define CUP2 (make-cup 8 "brown" "ceramic"))
(define CUP3 (make-cup 10 "red" "plastic"))
(define CUP4 (make-cup 6 "clear" "plastic"))

(define CUPS
  (cons CUP1
        (cons CUP2
              (cons CUP3
                    (cons CUP4 empty)))))

我们可以根据杯子的液体盎司容量对其进行分类,在这种情况下,我们可以:     10:CUP1和CUP3

8: CUP2

6: CUP4

或者,我们可以根据杯子的颜色对杯子进行分类,在这种情况下,我们可以:     “棕色”:CUP1和CUP2

"red": CUP3

"clear": CUP4

请注意,唯一的区别是我们要用于合并的项目的特征-我们将将此特征的不同值称为合并的“键”(例如,第一个中的10、8、6例)。结果中的每个条目(一个bin)都具有一个键以及具有该键的原始项目的列表(按原始列表中的顺序排列)。

设计带有三个参数的create-binning函数-元素列表,键提取器和键等价关系-并产生合并。

密钥提取器是一种从元素中提取信息以确定其应属于哪个bin的功能。在给出的第一个示例中,它将是一个需要杯子并产生其容量的函数。

等价关系是一个接受两个元素并生成一个布尔值的函数,该布尔值指示它们是否相等。在第二个示例中,键等价关系将是一个告诉我们两种颜色是否相等的函数。

1 个答案:

答案 0 :(得分:0)

首先要真诚地尝试自己解决问题,然后询问您的现有实现中的特定问题或您对问题的理解是什么,以及在那里你感到困惑。


让我们重新审视此问题的设计过程:

  1. 考虑Bin的数据定义。您如何抽象密钥和项目的各种“数据”?不要忘记解释和模板。写下不是Bin的{​​{1}}的示例。问题陈述中的这句话应有助于数据定义的设计:

      

    结果中的每个条目(bin)都有一个键以及具有该键的原始项目的列表

  2. 用您自己的话写下Cup的目的陈述。

  3. 写下create-binning的签名。最后两段详细说明了属于密钥提取器对等关系的签名部分。签名足够通用吗?

  4. 写下create-binning数据定义和您创建的Cup的其他实例上的键提取器和等效关系。在开始编写代码之前,请为Bin编写足够的测试。

  5. 按照模板进行操作,如果需要帮助者,请将其添加到“愿望清单”中。所有测试通过后,在必要时使用列表抽象。