Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 173
Текст из файла (страница 173)
Он будет описан позже. Заметим, что символ в=» обозначает не присваивание, а операцию унификации, которая предписывает ассоциировать новую копию идентификатора Х со значением 7. Это можно продемонстрировать, опустив ключевое слово ча1. В ответ на ввод Х = 8 М1.
выведет на печать строку чд) тт = Гв)ве: Ьоо1 означающую, что унификация текущего значения Х (то есть 7) со значением 8 ложна и поэтому возвращается значение 1а1ее. Определяемые пользователем типы Пользовательские типы можно определить с помощью оператора бататуре: бататуре идентификатор = внраиение типа Например, тип й песет оп (направление) можно определить так: — бвса1уре йгесттоп - ногти ! едет ! воось 1 нев1; соп еавт ; бтгесттоп соп ногти : й гесттоп соп воотп : й гес1топ соп неве : й гесттоп что создает четыре константы типа й гесттоп. Мы создали тип, похожий на перечисляемый тип в С н Разса!.
Оператор — ча1 ненптгесттоп - ногти; устанавливает тип Мен0т гесЬ топ как тип й гесЬ1оп со значением погтЬ. Это определение пользовательских типов можно распространить на типы дан- ных с древовидной структурой. Например, - баьатуре муйгесттоп = йг от йгесттоп, бвсатуре муй гесттоп СОП б1Г бтгесттоп -т Муй гесттоп создает тип Муй гест1оп, состоящий из функции выбора й г. Объекты типа Муй гост топ задаются как кортежи (то есть б1 г т погтп) ), например; - Чд) Яеабтп9 = бтг1погтп): ча1 Яеаб~пр - йг ногти .
'уй гесСтоп 628 Приложение, Обзоры языков Без кортежа получим значение направления: - на) Меча)еабчпр = погтп: на1 МеиНеаю па - погтп бтгессчоп Компоненты типов данных похожи на вызовы функций: - на1 Меиотгестчоп - бчг(Меинеабчпр): на1 Меиочгестчоп - бтг пагтп : Нубчгессчап Сила типов данных заключена в возможности создавать произвольные древовидные структуры данных. Например, иа рис. П.2 изображено дерево, состоящее из узлов Мио)Ептгу и СЬагЕптгу.
Спецификация булет иметь следующий вид: бататуре Тгее - Еер)у ) МоаЕптгу ог тпс * Тгее * Тгее ) Сла Ептгу ог зтгтпр * Тгее: бататуре Тгее соп Слаг Ептгу : зтгчпр * Тгее -т Тгее соп ЕарЕу . Тгее соп МмпЕптгу , чпт * Тгее * Тгее -и Тгее Ь)апчЕп)гу Рис. П.2. Древовидный тип данных языка МЕ Она означает, что тип данных Тгее саста то из трех частей: СЬа гЕп т гу, МопЕпСгу и Гарту. Структура рис. П.2 задается следующим образом: - на1 Меитгее-ноеЕпЕгу(7,МоиЕптгу(5.Еерту,МоаЕптгуЧА.Гарту.Еерйу)), - СлагЕптгу СА". МоаЕптгуЧЗ. Гарту Еерту))); на) МеиТгее " МиаЕпт гу (7.МоеЕпсгу(5,Еирту,вапЕптгу14,Еноту,Еерсу)), СпагЕптгуСА",МаиЕптгу(З,Еноту.Еирту))) Тгее Доступ к компонентам типов данных можно продемонстрировать с помощью следующей программы: бататуре оЬ)ест - рачг ог нт * чпм Тип СгеатеРачг(а, Ы - ратг(а.
Ы; топ сгеатетио(а,ь.с б) - сгеатерачг(а. ы :. сгеатерачг(с.б):: ц; Топ РгтптГчгзмрачгтх.у)::т) = ргтпмх) ) РгтптГчгзмх) = рппм "Еггог Чп"): Топ РюптТЬч гб(х;:у) - РюптГчгзму) ) РгчпттпчгбЧх) - ргюм "Еггог Чп"): г).7, мь 629 Выполнение операции та1 х = Сгеа(етыо(1.2.3.4); приводит к следующему результату: уа1 х =. (ра1г (1.2).ра>г (3.4)1: оо)ес( 1>в( а выполнение следующих операторов; Рыл(Г>гв((х): Рг>л(Таге(к); приводит к выводу 1 3 П.7.2. Управление последовательностью действий Выражения Арифметические выражения.
Арифметические выражения используют следую- щий порядок старшинства для выражении: Унарный минус Мультилликативные операторы Аддитивные операторы *. б Шт,нов Можно использовать полный набор арифметических операций сравнения: =, <>,, <ть < и >, Булевы выражения. Булевы выражения можно создавать, комбинируя следующие преднкатьс ал()а1зо, оге!зе и пот. Предикат ал()а!ао аналогичен предикату ап(), но разработан для «ленивого» вычисления: правый операнд вычисляется только в том случае, если левый принимает значение истина. Аналогично правый операнд опсрац>ш оге1 зе вычисляется, только если левый принимает значение ложь.
Строковые выражения. Конкатенация строк определяется знаком гс "аЬс' х "Ое(" = "аЬсве(". Пустая строка задается символами "". Выражение > Т, В М1. нет концепции условного опералтора, так как зто анцлика- тивный язык. Вместо него используется условное выражение (как в языке С): >( выражение (Ьел в случае истины е1ве в случае лжи Поскольку каждое выражение должно быть правильно определено, часть е1ае не является необязательной, как в операторах >)других языков, Выражение ыы1е. Выражение иЬ>1е задается следующим образом: ыш1е выражение, Оо выражение, и имеет очевидную иптсрпретацшо: выражение, выш>лпяется до тех пор, пока ис- тинно выражение,.
Однако как выражение, может изменить свое значение, если учи- тывать аппликатинную природу выполнения программ на языке М1? Выражение, должно изменить ассоциацию переменной н локальном окружении. Также в язы- ке М1. имеется понятие ссьыочной переменной, значение которой можно изменять.
Списочные выражения. Функции Ь>)(Ь) лля головы сш(ока Ь и (1(Е) для хвоста списка Ь осуществляют операции, подобные саг и саг в языке 1.1ор. Операция сола языка 115Р в языке М1.задается двойным двоеточием: .. Например, Ь()(Ь): 11(() = С 630 Приложение. Обзоры языков В языке МВ также существует операция объединения, которая соединяет два списка, [1,2]([3,4] = [1,2.3,4],Заметим,чтодляоперациих:: у,если химееттип ' а, у должен быть типа ' а 1)зС, в то время как лля объединения х(у обе переменные должны быть типа 'а 1) зС.
Приведение типов между списками и строками задается встроенными функциями ехр1обе и па)р1оое. Функция ехр1 обе преобразует строку в список односимвольных строк, а функция 1п)р1о()е получает в качестве параметра строковый список и ва)вращает строку, Операторы В языке М[. фактнчегки огсутствует понятие оператора, выполнение программы осуществляется как последовательность выполнения функций. Подобно тому, как выполняются программы на языке!.[ЯР, в М[. выполнение программы осуц(ествляется через рекурсивный вызов процедур. Каждое выражение завершается точкой с запятой (;).
Последовательное выполнение можно смоделировать выполнением последовательности (выражение,; выражение, .. . выражение„) Каждое выражение вычисляется в порядке его задания. Определение функций Функции определяются следующим образом: Гцп инп функции (паранетри) - выражение; где выражение — ато то выражение, которое следует вычислить. Параметры функции задаются в обычном контексте. Однако в отличие от других языков тип параметра можно опустить, если он выводим из контекста, Например, сумму двух чисел можно определить так: - ( цп и цап С ( а и п(, Ь и пС ) тпС = а+Ь; па1 вцппс - Гп , ппС * ппС -и |пС Здесь указывается, что функция зипп С получает в качестве параметров два целых () пс) значения, возвращает также целочисленное значение (1пс), а имя саппс имеет тип ГцпсС1оп с сигнатурой и пС * ) пС вЂ” а ) пС.
Любая нз приведенных ниже спецификаций ) пс однозначно определяет два лругих типа, так что следующие записи эквивалентны: - Гцп пцппС(а. Ь) ппС - апЬ; Гцп вцюС(а Ьипп) = апЬ: - Гцп пцпп С(а:1пп. Ь) = а+Ь: Олнако необходимо задать хотя бы одну спецификацию ) пс, поскольку запись - Гцп пцж1С(а. Ь) - а+Ь неоднозначна, из нее пе ясно, какой тип подразумевается — 1пС или геа1. Такой простой синтаксис позволяет определять мощные полнморфные функции. Рассмотрим функцию, которая перемешивает список путем перемещения головы списка в его конец. Она соединяет хвост списка со списком, состоящим только из его первого члена: - Гцг внц(Г1е(х) - С1(х) ф [Ьа(х)]; на1 ппц(Г1е = Гп 'а 1пп( -и а 1пвС П.7.
Айь 631 - еьиг(1е(11.2.3]): уа) 1С - 12,3,1] . !пг 1!е( Функция вью ТО е оперирует с любым списком типа ' а и возврап(ает список того же типа. Однако когда ььпТТ1 е применяется к конкретному списку [1. 2,3], возвращается специальный тип )пс 11зц В языке М] предусмотрена некоторая разновидность операции сопоставления с образцом для определения функций, как описано ранее в разделе ВА.2.
Можно определить собственную операцию соединения следующим образом: (ип аррепп(а. Ы - !( а-п(1 гпеп Ь е!ее Ье(е) :: еррепе((1(а),Ь); Данную конструкцию можно рассматривать как две отдельных области, в которых определена функция арреп(]. Если а — пустой список и! 1, то возвращается значение Ь. Если а не пуст, то осуществляется другая операция. Язык М] позволяет определить отдельнь)е обласги для функции: Срп ерр(п11,Ы - Ь ! арр(а.Ь) " ПС(а) :. арр(11(а).Ь); Для области, где первый аргумент и!1, значением является Ь, в других случаях значением будет Ь()(а):: арр(С1(а) .Ь).
Истинная сила операции сопоставления с образцом заключается в возможности доступа к компонентам сложных типов данных. Рассмотрим структуру, приведенную на рис. П.2. Объект Х типа Тгее определяется следующими компонентами; ЯпвЕпггу * Тгее * Тгее Сьаг(пггу * Тгее Евр(у Предположим, что мы хотим построить функцию 1азь, которая имела бы доступ к самому правому компоненту рисунка. Ее можно определить так: Тпп 1ае((яивЕпсгу(1,Т1,Т2))- !Г Т2 Еврьу Еьеп ~ Т Т1-Еврсу гпеп КивЕп(гу(1.11.12) е!ее 1ает(11) е)зе 1аеЫТ2) ! 1ае((СПагЕп(гу(С.П))- чт Т1«Евр(у Спер СПагЕп(гу(С,Т1) е1ее 1ае((11) ! 1а51(Евргу) - (аргу; где каждая подобласть функции ]азс рекурсивно выбирает самое правое поддерево, Когда мы применяем эту функцию к переменной )(енТгее, которую мы предварительно задали как структуру, изображенную на рисунке, мы получаем )(пвЕпсгу с целым компонентом 3; - 1ае((яепТгее).