Общий вопрос в том, какая структура модуля более удобна при добавлении экземпляров для существующих объектов? Какие есть плюсы и минусы?
Допустим, я хочу добавить экземпляр NFData для типа Seq. Я могу поместить его в:
Data.Sequence.Extra
(как и в пакете vty ) Data.Sequence.Instances.NFData
(подробнее точный) Control.DeepSeq.Instances
Control.DeepSeq.Instances.Sequence
Это тот случай, когда я не владею ни классом типа, ни типом данных. Другая распространенная ситуация - когда я владею классом типа типа и хочу добавить экземпляры для типа (ов) данных из какого-нибудь «тяжелого» пакета от Hackage, например OpenGL. Скажем, разработанный мной класс типов очень легкий и не имеет прямого отношения к OpenGL. Я не хочу, чтобы мой типовой класс зависел от "тяжелого" пакета, поэтому я хочу разместить экземпляры OpenGL в отдельном модуле (это мое интуитивное ощущение, если у вас другое мнение, давайте обсудим это). Итак, каким должен быть этот модуль:
MyClass.Instances.OpenGL
Graphics.Rendering.OpenGL.Extra
(вместе с экземплярами для других классов) Graphics.Rendering.OpenGL.Instances.MyClass
Какое решение более гибкое? В какой-то момент OpenGL можно заменить другой библиотекой или MyClass тоже. Есть ли тонкие нюансы?
Также какая схема лучше, если выбрать вариант MyClass.Instances
:
MyClass.Class
модуль для самого класса и базовых экземпляров и MyClass
модуль повторно экспортирует его (и, возможно, MyClass.Instances
) MyClass
модуль для классов и базовых экземпляров, а MyClass.All
повторно экспортирует все MyClass
модуль для класса и базовых экземпляров и нет модуля для повторного экспорта.