Binning с абстракциями для домашнего задания - PullRequest
0 голосов
/ 18 октября 2019

Упражнение 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 в первом примере). Каждая запись в результате, ячейка, имеет ключ, а также список исходных элементов, имеющих этот ключ (в том порядке, в каком они были в исходном списке).

Разработка функции create-binning, которая принимаетв 3 аргументах - список элементов, экстрактор ключа и отношение эквивалентности ключа - и создает биннинг.

Экстрактор ключа - это функция, которая извлекает информацию из элемента, чтобы определить, к какому бину он должен принадлежать,В первом приведенном примере это была бы функция, которая берет чашку и производит ее емкость.

Отношение эквивалентности - это функция, которая принимает два элемента и выдает логическое значение, указывающее, равны ли они или нет. Во втором примере отношение эквивалентности ключей будет функцией, которая сообщает нам, равны ли два цвета.

1 Ответ

0 голосов
/ 18 октября 2019

Сначала сделайте добросовестную попытку решить проблему самостоятельно, затем спросите о конкретных проблемах с вашей существующей реализацией или как вы понимаете проблему и где выв замешательстве.


Давайте вернемся к процессу проектирования с учетом этой проблемы:

  1. Подумайте об определении данных Bin. Как вы можете абстрагироваться от различных «видов данных» для ключей и предметов? Не забудьте интерпретацию и шаблон. Запишите примеры Bin, которые не Cup s. Это предложение из постановки задачи должно помочь в разработке определения данных:

    Каждая запись в результате, ячейка, имеет ключ, а также список исходных элементов, имеющих этот ключ

  2. Запишите своими словами формулировку цели для create-binning.

  3. Запишите подпись create-binning,Часть подписи, которая принадлежит ключу извлечения и отношению эквивалентности , подробно описана в последних двух параграфах. Достаточно ли универсальна подпись?

  4. Запишите ключевые экстракторы и отношения эквивалентности в определении данных Cup и другом экземпляре Bin, который вы сделали. Напишите достаточное количество тестов для create-binning, прежде чем начинать писать код.

  5. Следуйте шаблону, если вам нужны помощники, добавьте их в «список пожеланий». После того, как все тесты пройдены, используйте абстракции списка, где это необходимо.

...