Учебник по Haskell | страница 33



import Sub.Empty

Обратите внимание на то, что мы приписываем к модулю в поддиректории Sub имя поддиректории. Если

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

module Empty where

import Sub1.Sub2.Sub3.Sub4.Empty

26 | Глава 2: Первая программа

2.3 Логические значения

Пустой модуль это хорошо, но слишком скучно. Давайте перепишем объявленные в этой главе опреде-

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

Начнём с логических операций. Давайте не будем переопределять Bool, Show и Eq, а просто возьмём их

из Prelude:

module Logic where

import Prelude(Bool(.. ), Show(.. ), Eq(.. ))

Две точки в скобках означают “все конструкторы” (в случае типа) и “все методы” (в случае класса типа).

Строчку

import Prelude(Bool(.. ), Show(.. ), Eq(.. ))

Следует читать так: Импортируй из модуля Prelude тип Bool и все его конструкторы и классы Show и

Eq со всеми их методами. Если бы мы захотели импортировать только конструктор True, мы бы написали

Bool(True), а если бы мы захотели импортировать лишь имя типа, мы бы написали просто Bool без скобок.

Сначала выпишем в модуль наши синонимы:

module Logic where

import Prelude(Bool(.. ), Show(.. ), Eq(.. ))

true :: Bool

true = True

false :: Bool

false = False

not :: Bool -> Bool

not True

= False

not False = True

and :: Bool -> Bool -> Bool

and False

_

= False

and True

x

= x

or

:: Bool -> Bool -> Bool

or True

_ = True

or False

x = x

xor :: Bool -> Bool -> Bool

xor a b = or (and (not a) b) (and a (not b))

ifThenElse :: Bool -> a -> a -> a

ifThenElse True

t

_ = t

ifThenElse False

_

e = e

Теперь сохраним модуль и загрузим его в интерпретатор. Для наглядности мы установим флаг +t, при

этом будет возвращено не только значение, но и его тип. Понабираем разные комбинации значений:

*Logic> :l Logic

[1 of 1] Compiling Logic

( Logic. hs, interpreted )

Ok, modules loaded: Logic.

*Logic> :set +t

*Logic> not (and true False)

True

it :: Bool

*Logic> or (and true true) (or False False)

True

it :: Bool

*Logic> xor (not True) (False)

False

it :: Bool

*Logic> ifThenElse (or true false) True False

True

it :: Bool

Логические значения | 27

Разумеется в Haskell уже определены логические операции, здесь мы просто тренировались. Они называ-

ются not, (&& ), ||. Операция xor это то же самое, что и (/=). Для Bool определён экземпляр класса Eq. Также

в Haskell есть конструкция ветвления она пишется так:

x = if cond then t else e

Слова if, then и else – ключевые. cond имеет тип