练习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的功能。在给出的第一个示例中,它将是一个需要杯子并产生其容量的函数。
等价关系是一个接受两个元素并生成一个布尔值的函数,该布尔值指示它们是否相等。在第二个示例中,键等价关系将是一个告诉我们两种颜色是否相等的函数。
答案 0 :(得分:0)
首先要真诚地尝试自己解决问题,然后询问您的现有实现中的特定问题或您对问题的理解是什么,以及在那里你感到困惑。
让我们重新审视此问题的设计过程:
考虑Bin
的数据定义。您如何抽象密钥和项目的各种“数据”?不要忘记解释和模板。写下不是Bin
的{{1}}的示例。问题陈述中的这句话应有助于数据定义的设计:
结果中的每个条目(bin)都有一个键以及具有该键的原始项目的列表
用您自己的话写下Cup
的目的陈述。
写下create-binning
的签名。最后两段详细说明了属于密钥提取器和对等关系的签名部分。签名足够通用吗?
写下create-binning
数据定义和您创建的Cup
的其他实例上的键提取器和等效关系。在开始编写代码之前,请为Bin
编写足够的测试。
按照模板进行操作,如果需要帮助者,请将其添加到“愿望清单”中。所有测试通过后,在必要时使用列表抽象。