Отвлекая некоторые недавние вопросы, я подумал, что я обращу внимание на старого пугателя, OverlappingInstances
.
Несколько лет назад я, возможно, задавал этот вопрос всерьез: ведь вы можете предоставить полезные экземпляры по умолчанию, а другие могут переопределить их более конкретными, когда им это нужно, что может быть так плохо в этом?
По пути я усвоил некоторую оценку точки зрения, что OverlappingInstances
действительно не так чист и лучше избегается; главным образом, из-за того, что он не очень обоснован теоретически, в отличие от других больших расширений.
Но, думая об этом, я не уверен, могу ли я объяснить, что действительно так плохо об этом, другому человеку, если бы меня спросили.
Я ищу конкретные примеры того, как использование OverlappingInstances
может привести к плохим вещам, будь то подрыв системы типов или других инвариантов или просто общая неожиданность или беспорядок.
Одна конкретная проблема, о которой я знаю, заключается в том, что она разрушает свойство, которое просто добавление или удаление одного импорта модуля не может изменить смысл вашей программы, потому что при добавлении расширения новое перекрытие экземпляра может быть тихо добавлено или удалено, Хотя я могу понять, почему это неприятно, я не понимаю, почему это потрясающе ужасно.
Бонусный вопрос: до тех пор, пока мы находимся на предмет полезных, но не теоретически обоснованных расширений, которые могут привести к плохим событиям, почему GeneralizedNewtypeDeriving
не получает такой же плохой рэп? Это потому, что отрицательные возможности легче локализовать; что легче увидеть, что вызовет проблемы и скажет: "Не делай этого"?
(Примечание: я бы предпочел, чтобы основная часть ответа была сосредоточена на OverlappingInstances
, а не IncoherentInstances
, которая нуждается в меньшем пояснении.)
EDIT: есть также хорошие ответы на аналогичный вопрос здесь.