Почему объединение списков в SML правильно ассоциативно? - PullRequest
0 голосов
/ 30 апреля 2020

В книге Уллмана по SML

Наиболее необычным является то, что операторы :: (list cons) и @ (списка конкатенации) являются ассоциативными справа, то есть они группируются справа, а не слева. как и большинство операторов, с которыми мы сталкивались.

Я понимаю причину, по которой аргументы cons правильны: второй операнд должен быть списком, а возвращаемый - списком.

Почему конкатенация списка в SML справа ассоциативно, учитывая, что «большинство операторов, которые мы видели» в SML, остаются ассоциативно слева?

Спасибо.

1 Ответ

2 голосов
/ 30 апреля 2020

Стоимость конкатенации линейна по длине левого операнда, потому что она должна быть скопирована. Следовательно, x @ (y @ z) дешевле, чем (x @ y) @ z, поскольку последний скопирует список x дважды.

Кроме того, иногда вам потребуется смешивать операторы cons и concat (x @ y :: z), что было бы более неуклюжим, если бы они имели различный приоритет или ассоциативность.

...