52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 281

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 281

liftA2 (++) (readFile file1) (readFile file2)

Пуд сахара | 253

17.2 Расширения

Расширение появляется в ответ на проблему, с которой трудно или невозможно справится в рамках стан-

дарта Haskell. Мы рассмотрим несколько наиболее часто используемых расширений. Расширения подключа-

ются с помощью специального комментария. Он помещается в начале модуля. Расширение действует только

в текущем модуле.

{-# LANGUAGE

ExtentionName1, ExtentionName2, ExtentionName3 #-}

Обратите внимание на символ решётка, обрамляющие комментарии. Слово LANGUAGE говорит компи-

лятору о том, что мы хотим воспользоваться расширениями с именами ExtentionName1, ExtentionName2,

ExtentionName3. Такой комментарий называется прагмой (pragma). Часто компилятор ghc в случае ошибки

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

Он говорит возможно вы имели в виду расширение XXX. Например попробуйте загрузить в интерпретатор

модуль:

module Test where

class Multi a b where

В этом случае мы увидим ошибку:

Prelude> :l Test

[1 of 1] Compiling Test

( Test. hs, interpreted )

Test. hs:3:0:

Too many parameters for class Multi’

(Use -XMultiParamTypeClasses to allow multi-parameter classes)

In the class declaration for ‘Multi’

Failed, modules loaded: none.

Компилятор сообщает нам о том, что у нас слишком много параметров в классе Multi. В рамках стандар-

та Haskell можно создавать лишь классы с одним параметром. Но за сообщением мы видим подсказку, если

мы воспользуемся расширением -XMultiParamTypeClasses, то всё будет хорошо. В этом сообщении имя рас-

ширения закодировано в виде флага. Мы можем запустить ghc или ghci с этим флагом и тогда расширение

будет активировано, и модуль загрузится. Попробуем:

Prelude> :q

Leaving GHCi.

$ ghci -XMultiParamTypeClasses

Prelude> :l Test

[1 of 1] Compiling Test

( Test. hs, interpreted )

Ok, modules loaded: Test.

*Test>

Модуль загрузился! У нас есть и другая возможность подключить модуль с помощью прагмы LANGUAGE.

Имя расширения записано во флаге после символов -X. Добавим в модуль Test расширение с именем

MultiParamTypeClasses:

{-# LANGUAGE MultiParamTypeClasses #-}

module Test where

class Multi a b where

Теперь загрузим ghci в обычном режиме:

*Test> :q

Leaving GHCi.

$ ghci

Prelude> :l Test