Приведение смешанных типов к общему представлению
Таблица приведения обрабатывает известную смешанную пару, а числовая башня поднимает целые числа до рациональных и рациональные до комплексных.
Как обобщенная арифметика может выбирать общий тип, не скрывая неудачные приведения типов и не зацикливаясь между равноправными представлениями?
- Различение метода операции и процедуры приведения типа
- Повторный запуск обобщенной операции после одного направленного приведения типа
- Поднятие значений по явной иерархии целых, рациональных и комплексных чисел
- Применение арифметического метода только после того, как оба аргумента получат общий тип
- Сообщение об отсутствии общего типа вместо угадывания или бесконечной рекурсии
Первая программа содержит один арифметический метод для сложения двух рациональных значений. Для пары из целого и рационального числа прямого метода нет, поэтому apply-generic обращается к отдельной таблице приведения, преобразует целое число в рациональное со знаменателем 1 и повторяет попытку. Журнал приведения делает этот дополнительный шаг представления видимым. Он также предотвращает попытку приведения к тому же типу при отсутствии метода для одинаковых типов, что иначе привело бы к повторению без продвижения вперед.
Вторая программа заменяет попарный выбор приведения упорядоченной башней типов. Процедура rank определяет уровни integer, rational и complex. Процедура raise выполняет только следующий шаг преобразования вверх, а raise-to повторяет его до тех пор, пока оба значения не достигнут старшего входного ранга. Сложение целого и рационального числа поэтому использует рациональное сложение. Сложение рационального и комплексного числа использует комплексное сложение после одного вызова raise. Несвязанная метка polynomial не имеет ранга и возвращает no-common-type. Башня устраняет неоднозначность для этих упорядоченных типов, но это не означает, что любой тип данных принадлежит единой иерархии или что проекция вниз всегда проходит без потерь.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа с таблицей приведения возвращает ((rational 7 2) ((integer rational))). Программа с башней типов возвращает ((rational 5 2) (complex #t #t) no-common-type).
В первом запуске найдите неудавшийся поиск для смешанных типов, преобразование целого числа в рациональное и успешную повторную попытку для пары rational и rational. В запуске с башней типов сравните однократный подъем целого числа с подъемом рационального числа до комплексного, затем найдите ранний результат no-common-type перед вызовом любого арифметического метода для метки polynomial. Трасса выполнения фиксирует эти явные преобразования, а не каноническую иерархию для всех возможных систем типов.
Измените программу и сравните результат.
Добавьте тип real между rational и complex. Поднимите рациональное значение до real перед комплексным, затем определите, сколько шагов raise потребуется для сложения целого и комплексного чисел.
Показать подсказку
Обновите rank и настройте каждый шаг raise на перемещение ровно на один уровень. Обобщенная операция не должна требовать нового попарного приведения между integer и complex.