Общий вопрос: какая структура модуля более удобна при добавлении экземпляров для существующих объектов? Какие плюсы и минусы существуют?
Скажем, я хочу добавить экземпляр NFData для типа Seq. Я могу разместить его в:
-
Data.Sequence.Extra
(как то же самое делается в пакете vty) -
Data.Sequence.Instances.NFData
(точнее) -
Control.DeepSeq.Instances
-
Control.DeepSeq.Instances.Sequence
Это случай, когда я не владею ни классом типа, ни типом данных. Другая распространенная ситуация - когда я владею классом типа типа и хочу добавлять экземпляры для типов данных из некоторого "тяжелого" пакета из Hackage, например OpenGL. Скажем, класс типа I, который я разработал, очень легкий и не имеет прямого отношения к 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
модуль для класса и базовых экземпляров и модуль для реэкспорта.