Как организовать модули Haskell с экземплярами: придерживаться типа данных или класса типа?

Общий вопрос в том, какая структура модуля более удобна при добавлении экземпляров для существующих объектов? Какие есть плюсы и минусы?

Допустим, я хочу добавить экземпляр 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 модуль для класса и базовых экземпляров и нет модуля для повторного экспорта.

13
задан modular 10 July 2011 в 12:36
поделиться