Существует ли в haskell стандартное соглашение об именовании пространства имен?

Я в основном из мира питонов и уже несколько дней играю с haskell.

Как пользователь python, наиболее запутанные пространства имен библиотек из hackage/stackage.

Например, в python мы импортируем модуль Scotty, например import scotty, а haskell выполнит import Web.Scotty.

Haskellers, которые загружают свои библиотеки в стеке или взломе, предпочитают помещать свои библиотеки под пространства имен категории (например, Web, Language,...).

Оставив хороший подход или нет в перспективном представлении управления зависимостями вне обсуждения, существует ли какая-либо де-факто конвенция по этой категоризации?

Есть ли какой-либо согласованный сообществом справочник, например "Поместите эти библиотеки в категорию Network и поместите такие библиотеки в категорию Web или Data".

Ответ 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", а не всей семьи.