Почему Haskell рекурсивно импортирует экземпляры? Почему бы не импортировать все экземпляры только из указанного модуля? - PullRequest
1 голос
/ 29 мая 2020

Из отчета Haskell 2010, раздел 5.4. "объявление экземпляра находится в области видимости тогда и только тогда, когда цепочка объявлений импорта ведет к модулю, содержащему объявление экземпляра.".

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

Почему такое рекурсивное поведение желательно / необходимо? Было бы так плохо, если бы он включил в область видимости все экземпляры, содержащие только внутри целевого модуля? (Я не хочу импортировать один конкретный экземпляр c). Неужели это так сильно увеличит количество импорта? Есть ли какие-то фундаментальные / компиляционные / исторические причины, по которым этого не может быть?

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

1 Ответ

4 голосов
/ 30 мая 2020

Я считаю, что ответ ehird отсюда Явно импортированные экземпляры также дает ответ на этот вопрос. Если бы экземпляры не были импортированы рекурсивным образом, то можно было бы достичь того же эффекта, что и в их примере. какой-то Data.Ord модуль. Затем эту функцию можно использовать в каком-то другом модуле Baz.hs, который определяет свой собственный экземпляр Ord и не импортирует Data.Ord. Таким образом, это создало бы нежелательную несогласованность. Сначала я думал, что эта проблема просто применима к определенному импорту экземпляров c, но она также применима в этом случае. 1011

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...