haskell-notes

http://hackage.haskell.org

Если для вашей задачи необходимо выполнить какую-нибудь довольно общую задачу, например написать

тип красно-чёрных деревьев или построить парсер или возможно вам нужен веб-сервер, поищите этот пакет

на Hackage, он там наверняка окажется, ещё и в нескольких вариантах.

Для установки пакета с Hackage нужно просто написать

cabal install имя-пакета

Возможно нам нужен очень новый пакет, который был только что залит автором на Hackage. Тогда вы-

полняем:

cabal update

Происходит обновление данных о загруженных на Hackage. Что хорошо, вы можете загрузить исходники

из Hackage, например у вас никак не получается написать пакет, который устанавливался бы без ошибок.

Просто загрузим исходники какого-нибудь пакета из Hackage и посмотрим на пример рабочего пакета.

Пакеты | 269

Дополнительные атрибуты пакета

В файле . cabal также часто указывают такие атрибуты как:

Maintainer Поле содержит адрес электронной почты технической поддержки

Stability Статус версии библиотеки (стабильная, экспериментальная, нестабильная).

Description Подробное описание назначения пакета. Оно помещается на главную страницу пакета в доку-

ментации.

Extra-Source-Files В этом поле можно через пробел указать дополнительные файлы, включаемые в пакет.

Это могут быть примеры использования, описание в формате PDF или хроника изменений и другие

служебные файлы.

License-file Путь к файлу с лицензией.

ghc-options Флаги компиляции для GHC. Если в нашей библиотеке мы активно пользуемся продвинуты-

ми прагмами оптимизации, необходимо сообщить об этом компилятору пользователя. Например, мы

можем написать в этом атрибуте -O или -O2.

Установка библиотек для профилирования

Помните когда-то мы занимались профилированием? Это было в главе, посвящённой устройству GHC.

Мы включали флаг prof и всё шло гладко. Там мы профилировали код, в котором участвовали лишь

стандартные библиотеки из пакета base, такие как Prelude. Но если мы попробуем профилировать код с

какими-нибудь другими библиотеками, установленными с помощью cabal, GHC возмутится и скажет, что

для профилирования не хватает специальной версии библиотеки имярек. Для того чтобы иметь возможность

профилировать код, в котором участвуют другие библиотеки необходимо установить их с возможностью

профилирования. Это делается при установке с помощью специального флага –“enable-library-profiling

или –“enable-executable-profiling (если мы устанавливаем исполняемое приложение):

$ cabal install имярек —reinstall —enable-library-profiling

Библиотека будет установлена в двух экземплярах: для исполнения и профилирования. Возможно биб-

лиотека имярек потребует переустановки некоторых библиотек, от которых она зависит. Повторяем эту про-

цедуру для этих библиотек и возвращаемся к исходной библиотеке. К сожалению, избежать переустановки

библиотек нельзя. Но мы можем сделать так, чтобы все будущие библиотеки устанавливались с возмож-

ностью профилирования. Для этого необходимо отредактировать файл настроек программы cabal. Ищем

директори, в которой cabal хранит свои служебные файлы. Если вы пользуетесь Linux, то скорее всего это

скрытая директория . cabal в вашей домашней директории. Если вы пользуетесь Windows, положение ди-

ректории зависит от версии системы. Но ничего, узнать её положение можно, выполнив в ghci

Prelude> :m System.Directory

Prelude System.Directory> getAppUserDataDirectory ”cabal”

Присмотритесь к этой директории в ней вы найдёте много полезных данных. В ней находятся испол-

няемые программы, скомпилированные библиотеки, а также исходный код библиотек. В этой директории

находится и файл config с настройками для cabal. Ищем строчку с полем libraryprofiling: False. Меня-

ем значение на True и раскомментируем эту строчку, если она закомментирована. После этого cabal install

будет устанавливать библиотеки для профилирования. На первых порах это вызовет массу неудобств из-за

необходимости переустановки многих библиотек.

18.2 Создание документации с помощью Haddock

Если мы зайдём на Hackage, то там мы увидим длинный список пакетов, отсортированных по категориям.

К какой категории какой пакет относится мы указываем в . cabal-файле в атрибуте Category. Далее рядом с

именем пакета мы видим краткое описание, оно берётся из атрибута Synopsis. Если мы зайдём на страницу

одного из пакетов, то там мы увидим страницу в таком же формате, что и документация к стандартным

библиотекам. Мы видим описание пакета и ниже иерархию модулей. Мы можем зайти в заинтересовавший

нас модуль и посмотреть на объявленные функции, типы и классы. В самом низу страницы находится ссылка

к исходникам пакета.

“Домашняя страница” пакета была создана с помощью приложения Haddock. Оно генерирует документа-

цию в формате html по специальным комментариям. Haddock встроен в cabal, например мы можем сделать

документацию к нашему пакету hello. Для этого нужно переключиться на корневую директорию пакета и

вызвать:

270 | Глава 18: Средства разработки

cabal haddock

После этого в директории dist появится директория doc, в которой внутри директории html находится

созданная документация. Мы можем открыть файл index. html и там мы увидим “иерархию нашего” модуля.

В модуле пока нет ни одной функции, так получилось потому, что Haddock помещает в документацию лишь

те функции, у которых есть объявление типа. Если мы добавим в модуле Hello. hs: к единственной функции

объявление типа:

helloWorld :: String

helloWorld = hello ++ ”, ” ++ world ++ ”!”

И теперь перезапустим haddock. То мы увидим, что в модуле Hello появилась одна запись.

Комментарии к определениям

Прокомментировать любое определение можно с помощью комментария следующего вида:

— | Here is the comment

helloWorld :: String

helloWorld = hello ++ ”, ” ++ world ++ ”!”

Обратите внимание на значок “или”, сразу после комментариев. Этот комментарий будет включен в

документацию. Также можно писать комментарии после определения для этого к комментарию добавляется

значок степени:

helloWorld :: String

helloWorld = hello ++ ”, ” ++ world ++ ”!”

— ^ Here is the comment

К сожалению на момент написания этих строк Haddock может включать в документацию лишь латинские

символы. Комментарии могут простираться несколько строк:

— | Here is the type.

— It contains three elements.

— That’s it.

data T = A | B | C

Также они могут быть блочными:

Here is the type.

It contains three elements.

That’s it.

data T = A | B | C

Мы можем комментировать не только определение целиком, но и отдельные части. Например так мы

можем пояснить отдельные аргументы у функции:

add :: Num a => a

— ^ The first argument

-> a

— ^ The second argument

-> a

— ^ The return value

Методы класса и отдельные конструкторы типа можно комментировать как обычные функции:

data T

— | constructor A

= A

— | constructor B

| B

— | constructor C

| C

Или так:

Создание документации с помощью Haddock | 271

data T = A

— ^ constructor A

| B

— ^ constructor B

| C

— ^ and so on

Комментарии к классу:

— | С-class

class С a where

— | f-function

f :: a -> a

— | g-function

g :: a -> a

Комментарии к модулю

Комментарии к модулю помещаются перед объявлением имени модуля. Эта информация попадёт в самое

начало страницы документации:

Читай продолжение на следующей странице
Добавить комментарии