2016-02-02 2 views
3

Это цитата из SICP о принуждении. В этом разделе рассказывается о арифметическом пакете с обычными числами, рациональными и комплексными числами и делать операции поперечного типа на них (например, добавление комплексного числа к обычному числу.) СхемаСоздание процедур принуждения в SICP

Это принуждение имеет много преимуществ по сравнению с методом определения явных операций перекрестного типа, как описано выше. Хотя нам еще нужно написать процедуры принуждения для связывания типов (возможно, N^2 процедур для системы с N типами), нам нужно написать только одну процедуру для каждой пары типов, а не другую процедуру для каждой коллекции типов и каждой общей операции.

Я запутался в этой строке:

«возможно, N^2 процедуры для системы с типами N»

Давайте арифметический пример пакета. Операции, которые делятся двумя обычными числами (номер схемы схемы), двумя рациональными числами (рациональным рациональным) и двумя комплексными числами (сложным комплексом), являются одинаковыми типами, поэтому они не включены в процедуры принуждения.

У нас есть три типа, это процедуры принуждения, которые я могу представить только с двумя аргументами.

(схема номер рациональные) (схема номер комплекс) (рациональная схема номер) (рациональный комплекс) (комплексная схема-номер) (комплексный рациональный)

Это не п^2 процедуры принуждения. Здесь всего шесть процедур принуждения, а не 9. Я думаю, что я вообще не понимаю эту часть текста. Может кто-нибудь объяснить, что я пропустил?

Наконец, вот сноска относительно этой части текста.

Если мы умны, мы можем обычно проходить с использованием N^2 принуждения процедур. Например, если мы знаем, как конвертировать из типа 1 в тип 2 и от типа 2 к типу 3, то мы можем использовать эти знания для преобразования из типа 1 в тип 3. Это может значительно уменьшить количество процедур принуждения нам нужно явно указать, когда мы добавим в систему новый тип . '

Из того, что я понимаю, если мы можем преобразовать обычное число в рациональное число, тогда преобразуем это рациональное число в комплексное число, нам не нужна процедура, которая превращает обычный в комплекс. Это правильно?

Может ли кто-нибудь объяснить это более четко?

+2

Я думаю, что цитата подсчитывает (номер схемы схемы), (рациональное рациональное) и (сложный комплекс) тоже. – jkiiski

+0

@jkiiski вот что я и думал. Но принуждение определяется как «преобразовать объект одного типа в эквивалентный объект другого типа», однако не упоминается о принуждении двух аргументов с одинаковыми типами и игнорировании его, когда не требуется преобразовывать типы. Это самоочевидно? – morbidCode

+0

Я на самом деле не читал SICP, поэтому не могу сказать точно, но я думаю, автор ссылался на общий объем процедур в круглых скобках, а не на процедуры принуждения. Может быть, он просто упростил это, потому что говорить «N^2 процедуры» проще, чем говорить «N * (N-1) процедуры принуждения плюс N procdures для тех же самых типов». – jkiiski

ответ

2

Первая часть, которую я понял как O (N^2): если существует 10 типов, нам потребуется около 100 операций (в действительности, 90). Что касается второй части, вы правы: мы можем создать сложное принуждение. Однако, насколько я мог думать о его реализации, это потребует создания ориентированного графа с node = types и edge = coercions. И затем поиск правильных принуждений будет включать прохождение по графику, чтобы найти путь от одного узла к другому (не дешево!).

PS.Сделать вещи еще более сложными: как сложные, так и рациональные могут действовать как контейнеры для других типов, например. комплекс рациональностей, комплекс целых чисел, рациональное целое число (простейшая версия), рациональность многочленов и т. д. Тогда вопрос о принуждении становится еще хуже: рассмотрим добавление 1 + 2i, 2/3 и 3.0 - сначала все должно быть преобразовано в их соответствующие комплексные представления (1 + 2i, 2/3 + 0/1i, 3.0 + 0.0i) и только затем принуждают все это к плаванию внутри комплекса ... TL; DR: количество принуждения - это кошмар, я рад Мне не нужно это делать самому!

Смежные вопросы