Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Funktsionalnoe_i_logicheskoe_programmirovanie.doc
Скачиваний:
32
Добавлен:
19.01.2023
Размер:
1.75 Mб
Скачать

2.2 Функции работы со строками и множествами.

Распространенной областью применения Haskell является синтаксический анализ или парсинг различных строк. В модуле Char определены различные функции работы со строками. Наиболее распространенные и необходимые функции для выполнения данной лабораторной работы приведены в таблице 2.2. Для использования этих функций в тексте собственной программы необходимо подключить модуль, набрав директиву компилятора import и указав после этого имя модуля с заглавной буквы. При проверке же отдельных выражений в интерпретаторе подключение модуля выполняется с помощью :also Char.

Таблица 2.2. Функции модуля Char

Описание

Имя функции

Пример

Примечание

Код символа

ord :: Char -> Int

Символ с заданным кодом

chr:: Int  -> Char

Проверка буквы

isAlpha

Проверка прописной буквы

isUpper

Проверка строчной буквы

isLower

Проверка цифры

isDigit

Проверка восьмеричной цифры

isOctDigit

Проверка шестнадцатеричной цифры

isHexDigit

Проверка буквы или цифры

isAlphaNum

Преобразование цифры в число

digitToInt

преобразовывает шестнадцатиричные цифры в любом регистре

Преобразование числа в цифру

intToDigit

преобразовывает число в шестнадцатиричную цифру в нижнем регистре

Преобразование буквы в прописную

toUpper

не изменяет символов, не являющихся строчными буквами

Преобразование буквы в строчную

toLower

не изменяет символов, не являющихся прописными буквами

В модуле List имеются несколько полезных функций, позволяющих работать со списками как с множествами в математическом определении. В следующей таблице эти функции приведены.

Таблица 2.3. Функции модуля List для работы с множествами

Описание

Имя функции

Пример

Примечание

Преобразование списка во множество

nub

удаляет из списка повторяющиеся элементы

Объединение

union

Пересечение

intersect

Разность

\\

инфиксная операция

2.3 Сообщения об ошибках и преобразования типов

В предыдущем разделе в таблице 2.2 упоминалась функция digitToInt для преобразования символа в число. А как преобразовать в число целую строку? Можно, конечно, написать рекурсивную функцию, последовательно применяющую digitToInt к каждому символу строки. Но можно поступить проще и использовать функцию show. Более того, с помощью этой функции можно преобразовать в строку и очень многие другие типы данных:

,Нельзя применять эту функцию к данным типа функции или к типам, определенным пользователем, если специально не предусмотреть такое преобразование.

Преобразование строк в другие типы данных можно осуществить с помощью функции read. Чтобы указать компилятору, в какой именно тип данных необходимо преобразовать строку можно, во-первых, применить к выражению какую-то функцию, применимую к этому типу данных:

и компилятор попробует «догадаться», какой именно тип вы имели в виду. Во-вторых, можно просто указать нужный тип данных:

Рассмотрим следующую простенькую задачу – пусть наша функция должна вернуть длину заданного непустого списка или напечатать сообщение «null list» в случае пустого списка. Если попробовать определить функцию так:

,

то компилятор выдаст ошибку. Почему? А потому, что функция пытается выдать в качестве результата значения разных типов. Можно попробовать, конечно, во второй строке применить к результату функцию show. Но зачем же мы будем вместо числа выдавать строку? В этом случае нам поможет функция error. Она имеет в качестве аргумента строку, обычно это сообщение об ошибке, и возвращает значение произвольного типа, подходящее в любом месте. Если переписать последнюю функцию так:

, то проблем с компиляцией не возникнет, и функция будет работать именно так, как требовалось. Для ленивых существует вариант этой функции – функция undefined, для которой даже аргумента-строки не требуется, она будет возвращать стандартное сообщение об ошибке.