Сначала выпишем в модуль наши синонимы:
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 of1] 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 = ifcond thent elsee
Слова if, thenи else– ключевые. cond имеет тип Bool, а t и e одинаковый тип.
В коде программы обычно пишут так:
x = ifa >3
then”Hello”
else( ifa <0
then”Hello”
else”Bye”)
Отступы обязательны.
Давайте загрузим в интерпретатор модуль Preludeи наберём те же выражения стандартными функция-
ми:
*Logic> :m Prelude
Prelude>not ( True && False)
True
it :: Bool
Prelude>( True && True) ||( False || False)
True
it :: Bool
Prelude>not True /= False
False
it :: Bool
Prelude> if( True || False) then True else False
True
it :: Bool
Бинарные операции с символьными именами пишутся в инфиксной форме, то есть между аргументами
как в a &&b или a +b. Значение с буквенным именем также можно писать в инфиксной форме, для этого
оно заключается в апострофы, например a ‘and‘ b или a ‘plus‘ b. Апострофы обычно находятся на одной
кнопке с буквой “ё”. Также символьные функции можно применять в префиксной форме, заключив их в
скобки, например ( &&) a b и ( +) a b. Попробуем в интерпретаторе:
Prelude> True && False
False
it :: Integer
Prelude>( &&) True False
False
it :: Bool
Prelude> letand a b =a &&b
and :: Bool -> Bool -> Bool
Prelude>and True False
False
it :: Bool
Prelude> True‘and‘ False
False
it :: Bool
Обратите внимание на строчку letand a b =a &&b. В ней мы определили синоним в интерпретаторе.
Сначала мы пишем ключевое слово letзатем обычное определение синонима, как в программе. Это простое
однострочное определение, но мы можем набирать в интерпретаторе и более сложные. Мы можем написать
несколько строчек в одной, разделив их точкой с запятой:
Prelude> letnot2 True = False; not2 False = True
Мы можем записать это определение более наглядно, совсем как в редакторе, если воспользуемся много-
строчным вводом. Для этого просто наберите команду :{. Для выхода воспользуйтесь командой :}. Отметим,
что точкой с запятой можно пользоваться и в обычном коде. Например в том случае если у нас много кратких
определений и мы хотим записать их покомпактней, мы можем сделать это так:
a1 =1;
a2 =2;
a3 =3
a4 =4;
a5 =5;
Читать дальше