Мы говорили о том, что обычные числа в Haskell перегружены, иногда возникает необходимость в пе-
регруженных строках, как раз для этого существует расширение OverloadedStrings. При этом за обычной
записью строк может скрываться любой тип из класса:
class IsStringa where
fromString :: String ->a
Расширение TypeOperatorsпозволяет определять инфиксные имена не только для конструкторов типов,
но и для самих типов, синонимов типов и даже классов:
dataa :+:b = Lefta | Rightb
17.3 Краткое содержание
В этой главе мы затронули малую часть возможностей, которые предоставляются системой ghc. Haskell
является полигоном для испытания самых разнообразных идей. Это экспериментальный язык. Но в практиче-
ских целях в 1998 году был зафиксирован стандарт языка, его обычно называют Haskell98. Любое расшире-
ние подключается с помощью специальной прагмы Language. Новый стандарт Haskell Primeвключит в себя
наиболее устоявшиеся расширения. Также мы рассмотрели несколько полезных классов и синтаксических
конструкций, которые, возможно, облегчают написание программ.
17.4 Упражнения
Это была справочная глава, присмотритесь к рассмотренным возможностям и подумайте какие нужны
вам, а какие нет. Возможно вы вовсе не будете ими пользоваться, но некоторые из них могут встретиться
вам в чужом коде или в библиотеках.
264 | Глава 17: Дополнительные возможности
Глава 18
Средства разработки
В этой главе мы познакомимся с основными средствами разработки больших программ. Мы научимся
устанавливать и создавать библиотеки, писать документацию.
18.1 Пакеты
В Haskell есть ещё один уровень организации данных, мы можем объединять модули в пакеты (package).
Также как и модули пакеты могут зависеть от других пакетов, если они пользуются модулями их этих па-
кетов. Одним пакетом мы уже пользовались и довольно часто, это пакет base, который содержит все стан-
дартные модули, например такие как Prelude, Control.Applicativeили Data.Function. Для создания и
установки пакетов существует приложение cabal. Оно определяет протокол организации и распростране-
ния модулей Haskell.
Создание пакетов
Предположим, что мы написали программу, которая состоит из нескольких модулей. Пусть все модули
хранятся в директории с именем src. Для того чтобы превратить набор модулей в пакет, нам необходимо
поместить в одну директорию с src два файла:
• имяПакета.cabal – файл с описанием пакета.
• Setup.hs – файл с инструкциями по установке пакета
.cabal
Посмотрим на простейший файл с описанием библиотеки, этот файл находится в одной директории с
той директорией, в которой содержатся все модули приложения и имеет расширение .cabal:
Name
: Foo
Version
:1.0
Library
build -depends
:base
exposed -modules
: Foo
Сначала идут свойства пакета. Общий формат определения свойства:
ИмяСвойства : Значение
В примере мы указали имя пакета Foo, и версию 1.0. После того, как мы указали все свойства, мы опре-
деляем будет наш пакет библиотекой или исполняемой программой или возможно он будет и тем и другим.
Если пакет будет библиотекой, то мы помещаем за набором атрибутов слово Library, а если это исполняе-
мая программа, то мы помещаем слово Executable, после мы пишем описание модулей пакета, зависимости
от других пакетов, какие модули будут видны пользователю. Формат составления описаний в этой части та-
кой же как и в самом начале файла. Сначала идёт зарезервированное слово-атрибут, затем через двоеточие
следует значение. Обратите внимание на отступы за словом Library, они обязательны и сделаны с помощью
пробелов , cabal не воспринимает табуляцию.
Файл .cabal может содержать комментарии, они делаются также как и в Haskell, закомментированная
строка начинается с двойного тире.
| 265
Setup.hs
Файл Setup.hs содержит информацию о том как устанавливается библиотека. При установке могут ис-
пользоваться другие программы и библиотеки. Пока мы будем пользоваться простейшим случаем:
import Distribution.Simple
main =defaultMain
Этот файл позволяет нам создавать библиотеки и приложения, которые созданы только с помощью
Читать дальше