Ответ 1
Имя пакета, теги пакета и имена модулей - все независимые вещи.
Имя пакета - это произвольный идентификатор (если он не сталкивается ни с кем другим). Его обычный способ сделать все в нижнем регистре с дефисами между словами. Если несколько пакетов являются частью семейства, тогда формат является, например, "llvm-base" с фамилией в первую очередь. В соответствии с названиями ручного пакета Cabal могут быть буквы, цифры и дефисы, но не пробелы. Я не знаю о каких-либо других пунктуациях, но я бы избежал этого, даже если Кабал справится с этим. Кроме того, благодаря различным правилам прописные буквы в именах путей между Windows и Linux может возникнуть путаница, поэтому лучше всего придерживаться нижнего регистра.
Теги используются, чтобы помочь таким сайтам, как Hackage, упорядочить список пакетов в полезные группы и не иметь другого значения.
В пакете будет один или несколько модулей. Это то, что импортирует исходный код клиента. Модули существуют в иерархическом пространстве имен. Так, например, пакет parsec включает в себя модуль "Text.Parsec.Combinator". Вы можете думать о точках, похожих на Linux "/" в имени пути (и на самом деле источник будет в файле в "src/Text/Parsec/Combinator.hs" ).
Существует несколько имен стандартных модулей верхнего уровня, таких как "Управление" , "Данные", "Текст" и "Система", которые вы можете использовать в соответствии с основным заданием модуля. Его хороший стиль использовать их, но не обязательно. Внешний вид имени пакета в имени модуля (например, "Parsec" ) существует только во избежание конфликтов имен; формальное соотношение между именем пакета и его модулями отсутствует.
Вполне возможно иметь пакет с модулями в разных иерархиях верхнего уровня. Например, у вас может быть пакет, содержащий "System.Foo" и "Data.Foo".
В широком смысле "Управление" используется для монадов и связанных с ними вещей, особенно монадических и стрелочных комбинаторов. Но поскольку монада также является типом данных, вы не должны чувствовать необходимость вставлять монадический тип в отдельный модуль, чтобы получить его в "Управление" .
"Данные" - это все. Если вы сомневаетесь, поместите его в Data.
"Система" используется для средств операционной системы, особенно для тех, которые могут быть не переносимыми.
"Текст" используется для обработки текста, разбора, печати и т.д. Возможно, что-нибудь с большим количеством манипуляций с строками.
"Графика": очевидно.
Необязательно иметь имя модуля на одном уровне, а затем другие модули под ним. Таким образом, "Text.Parsec" является модулем, а также "Text.Parsec.Combinators", но разработчику Parsec не нужно было включать "Text.Parsec". Когда это делается, обычно это означает, что модуль верхнего уровня (в данном случае "Text.Parsec" ) экспортирует общий поднабор его дочерних модулей, поэтому во многих случаях клиентскому коду просто нужно импортировать "Text.Parsec", а не всей семьи.