регруженных строках, как раз для этого существует расширение OverloadedStrings. При этом за обычной
записью строк может скрываться любой тип из класса:
class IsString a where
fromString :: String -> a
Расширение TypeOperators позволяет определять инфиксные имена не только для конструкторов типов,
но и для самих типов, синонимов типов и даже классов:
data a :+: b = Left a | Right b
17.3 Краткое содержание
В этой главе мы затронули малую часть возможностей, которые предоставляются системой ghc. Haskell
является полигоном для испытания самых разнообразных идей. Это экспериментальный язык. Но в практиче-
ских целях в 1998 году был зафиксирован стандарт языка, его обычно называют Haskell98. Любое расшире-
ние подключается с помощью специальной прагмы Language. Новый стандарт Haskell Prime включит в себя
наиболее устоявшиеся расширения. Также мы рассмотрели несколько полезных классов и синтаксических
конструкций, которые, возможно, облегчают написание программ.
17.4 Упражнения
Это была справочная глава, присмотритесь к рассмотренным возможностям и подумайте какие нужны
вам, а какие нет. Возможно вы вовсе не будете ими пользоваться, но некоторые из них могут встретиться
вам в чужом коде или в библиотеках.
264 | Глава 17: Дополнительные возможности
Глава 18
Средства разработки
В этой главе мы познакомимся с основными средствами разработки больших программ. Мы научимся
устанавливать и создавать библиотеки, писать документацию.
18.1 Пакеты
В Haskell есть ещё один уровень организации данных, мы можем объединять модули в
Также как и модули пакеты могут зависеть от других пакетов, если они пользуются модулями их этих па-
кетов. Одним пакетом мы уже пользовались и довольно часто, это пакет 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 может содержать комментарии, они делаются также как и в Haskell, закомментированная
строка начинается с двойного тире.
| 265
Setup.hs
Файл Setup. hs содержит информацию о том как устанавливается библиотека. При установке могут ис-
пользоваться другие программы и библиотеки. Пока мы будем пользоваться простейшим случаем:
import Distribution.Simple
main = defaultMain
Этот файл позволяет нам создавать библиотеки и приложения, которые созданы только с помощью
Haskell. Это не так уж и мало!
Создаём библиотеки
Типичный файл . cabal для библиотеки выглядит так:
Name:
pinocchio
Version:
1.1. 1
Cabal-Version:
>= 1.2
License:
BSD3
License-File:
LICENSE
Author:
Mister Geppetto
Homepage:
http://pinocchio. sourceforge. net/
Category:
AI
Synopsis:
Tools for creation of woodcrafted robots
Build-Type:
Simple
Library
Build-Depends: base
Hs-Source-Dirs: src/
Exposed-modules:
Wood.Robot.Act, Wood.Robot.Percept, Wood.Robot.Think
Other-Modules:
Wood.Robot.Internals