Co jest takiego złego w nakładaniu się instancji?

Odrzuciwszy kilka ostatnich pytań, pomyślałem, że zwrócę uwagę na starego bogeymana,OverlappingInstances.

Kilka lat temu mogłem zadać to pytanie na poważnie: w końcu możesz dostarczyć użytecznych domyślnych instancji, a inni mogą je zastąpić bardziej konkretnymi, kiedy będą tego potrzebować, co może być z tym tak źle?

Po drodze zaabsorbowałem trochę szacunku dla tego punktu widzeniaOverlappingInstances naprawdę nie jest tak czysty i najlepiej go unikać; głównie z tego, że teoretycznie nie jest dobrze ugruntowany, w przeciwieństwie do innych dużych rozszerzeń.

Ale myśląc o tym, nie jestem pewien, czy mógłbym wyjaśnić to, co tak naprawdę jest złe, innej osobie, gdybym został zapytany.

To, czego szukam, to konkretne przykłady sposobów używaniaOverlappingInstances może prowadzić do złych wydarzeń, czy to poprzez obalenie systemu typów lub innych niezmienników, czy po prostu ogólne nieoczekiwanie lub bałagan.

Szczególny problem, jaki znam, polega na tym, że przerywa on właściwość polegającą na tym, że dodanie lub usunięcie pojedynczego importu modułu nie może zmienić znaczenia twojego programu, ponieważ przy rozszerzeniu można nałożyć lub usunąć nowe nakładanie się instancji. Podczas gdy widzę, dlaczego to jest nieprzyjemne, nie rozumiem, dlaczego to jest strasznie okropne.

Pytanie bonusowe: Tak długo jak jesteśmy na temat użytecznych, ale nie teoretycznie dobrze ugruntowanych rozszerzeń, które mogą prowadzić do złych wydarzeń, jak to możliweGeneralizedNewtypeDeriving nie ma tego samego złego rapu? Czy to dlatego, że negatywne możliwości są łatwiejsze do zlokalizowania; że łatwiej jest zobaczyć, co spowodowałoby problemy i powiedzieć „nie rób tego”?

(Uwaga: wolałbym, żeby najważniejsza była odpowiedźOverlappingInstances, nieIncoherentInstances co wymaga mniej wyjaśnień.)

EDYCJA: Istnieją również dobre odpowiedzi na podobne pytanietutaj.

questionAnswers(1)

yourAnswerToTheQuestion