Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[1]

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

-3 div 0; Failure: Div

Ошибки в согласовании типов не так привычны. Мы подробно рассмотрим типы и связанные с ними ошибки позднее; пока отметим, что ошибки в согласовании типов возникают при некорректном использовании значений, например, при попытке прибавить 3 к true:

- 3+true;

Type clash in:3+true

Looking for a:int

I have found a:bool

Одной из весьма неприятных ошибок, не распознаваемых ML-систе-мой, является бесконечный цикл. Если вы подозреваете, что ваша программа зациклилась, вы можете прекратить ее выполнение, нажав клавишу прерывания (обычно Ctrl-C). ML выдаст сообщение, говорящее о том, что возникло исключительное событие "interrupt", и вернется на верхний уровень выполнения программы. Некоторые реализации содержат средства отладки, которые могут помочь в определении причины зацикливания.

Бывают и другие виды ошибок, но они встречаются значительно реже, и возможные причины их трудно объяснить в общем случае. Если вы встретитесь с сообщением об ошибке, смысл которого вы не можете понять, постарайтесь найти кого-нибудь, кто имеет больше опыта в работе с ML, чтобы он помог вам разобраться в ситуации.

Детали интерфейса пользователя меняются от реализации к реализации, особенно в части формата ВЫ ВОД et И сообщений об ошибках. Приводимые в настоящей книге примеры основываются на Эдинбургском ML; мы полагаем, что после знакомства с этими примерами у вас не должно возникнуть трудностей в понимании выдач других ML-систем.

2.2 Первичные выражения, значения и типы

Мы начнем наше введение в ML с описания множества первичных типов. В ML тип есть множество значений. Например, целые числа образуют тип; множество всех символьных строк и множество логических значений ("истина" и "ложь") также образуют типы. Если имеются два типа а и г, то множество всех упорядоченных пар, первый член которых имеет тип а, а второй - тип г, является типом. Более того, множество всех функций, отображающих значения одного типа в значения другого типа, также образуют тип. В дополнение к этим и другим определенным


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

Выражения в ML изображают значения точно так же, как последовательности цифр изображают числа. Тип выражения определяется системой правил, которые гарантируют, что если выражение имеет значение, то значение выражения принадлежит типу выражения (ну как, понятно?). Например, каждая последовательность цифр имеет тип int, поскольку значением последовательности цифр является целое число. Мы проиллюстрируем систему типов ML примерами.

2.2.1Тип unit

Тип unit состоит из единственного значения, записываемого как (). Этот тип используется в тех случаях, когда выражение не имеет какого-либо осмысленного значения, а также вместо аргумента функции в тех случаях, когда функция не должна иметь аргументов2.

2.2.2Логические значения (тип bool)

Тип bool состоит из значений true и false. Для работы со значениями этого типа имеются одноместная операция not и две двухместных операции andalso и orelse (соответствующие обычным логическим операциям "не", "и" и "или")3.

Условное выражение if е then ei else в2 мы также рассмотрим здесь, поскольку его первый аргумент, е, должен иметь тип bool. Обратите внимание, что часть else должна присутствовать обязательно. Причина этого в том, что if в ML является условным выражением, а не условным утверждением, как, например, в Pascalе. Если бы часть

"Иногда возникает необходимость рассматривать функции, принимающие постоянные (не зависящие от аргумента) значения. Поскольку зачастую в таких случаях область определения несущественна, уместно в качестве нее использовать unit. При этом в ML важно отличать саму функцию (что записывается как f) от результата ее применения (что записывается как f ()). (Прим. перев.)

3Имеются веские причины, по которым вместо традиционных названий and и or для бинарных логических операций используются неожиданные andalso и orelse. Причины этого следующие. ML является строгим языком; это означает, что все аргументы функции вычисляются до вычисления значения функции. Если при этом окажется, что какой-либо аргумент не может быть вычислен (например, в процессе его вычисления возникает зацикливание), то и само значение функции не сможет быть вычислено. Операции же andalso и orelse являются исключениями из этого правила: при вычислении, например, ei andalsо вг сначала вычисляется ei, и если его значение есть false, то вг не вычисляется, а значением всего выражения будет false. Таким образом, выражение false andalso вг будет всегда определено (и будет иметь значение false) - в отличие, например, от выражения 0 * вг, значение которого будет не определено, если не определено вг. (Прим. перев.)


else отсутствовала, то при значении e равном false выражение не имело бы значения. Кроме того, типы выражений ei и e2 должны совпадать. Выражение

if true then true else ()

является некорректным с точки зрения типизации (или, короче, нети-пизируемым), поскольку тип выражения в части then есть bool, а тип выражения в части else - unit.

-not true;

>false : bool

-false andalso true;

>false: booi

-false orelse true;

>true : bool

-if false then false else true;

>true: bool

-if true then false else true;

>false: bool

2.2.3 Целые числа (тип int)

Тип int является множеством (положительных и отрицательных) целых чисел. Целые числа записываются обычным способом, за исключением того, что для отрицательных чисел знак записывается тильдой вместо традиционного минуса -.

>75 : itn

>"24 : int

-(3+2) div 2;

>2 : int

-(3+2) mod 2;

>1 : int

Выражения могут содержать обычные знаки арифметических операций +, -, *, div и mod (div и mod обозначают соответственно целочисленное деление и получение остатка от деления нацело). Имеются и знаки для операций сравнения <, <=, >, >=, = и о. Все эти операции требуют двух аргументов типа int и возвращают результат типа bool (true или false в соответствии с тем, выполнено условие или нет).

-3<2

>false : bool



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32]