Erlang для самых маленьких. Глава 4: Система типов

imageХороший понедельник, Хабр! Мы продолжаем изучение Erlang для самых маленьких.В прошлой главе мы разобрались с синтаксисом функций. В этой главе мы познакомимся с системой типов языка.

Список глав

Динамическая сильная типизация Если вы читали прошлые главы, то, скорее всего, обратили внимание, что мы нигде не указывали типы переменных и возвращаемых функциями значений. Так же мы не указывали тип данных при сопоставлении с образцом. Например, кортеж {A, B} может принимать значение {someAtom, 100}, {100.0, «Some string»} и т.д. Если данные будет невозможно сопоставить с указанным образцом, будет сгенерирована ошибка. Это произойдет непосредственно в момент выполнения кода. Это происходит потому что Erlang — динамически типизированный язык. Компилятор не может отловить все ошибки на этапе компиляции. Поэтому многие ошибки генерируются во время выполнения программы.

Почему Erlang не имеет статической типизации? Немало копий было сломано в спорах о том, какая типизация лучше: статическая или динамическая. У каждой есть свои плюсы и минусы. Один из главных минусов динамической типизации — невозможность поиска ошибок, связанных с типами, на этапе компиляции. Из-за этого такие ошибки возникают в рантайме и программа «падает», что снижает общую надежность программного продукта. Но Erlang решает эту проблему другим, более эффективным способом.

Идеология Erlang: «Если оно сломалось — пусть ломается». Язык обладает инструментами, позволяющими изолировать и корректно обрабатывать все ошибки, которые могут возникнуть. Это делает программы на Erlang очень живучими. Классический пример живучести программ на Erlang, который приводят — ПО коммутаторов Ericsson AXD 301 ATM. Этот продукт имеет больше миллиона строк кода и аптайм 99.9999999%. Впечатляет.

В общем, Erlang не стремиться избегать ошибок. Он предлагает правильно их обрабатывать.

Так же Erlang относится к языкам с сильной типизацией. Это значит, что приведения типов нужно производить явно. Если мы будет использовать в одном выражении несовместимые типы данных, то получим ошибку:

1> 10 — »5». ** exception error: bad argument in an arithmetic expression in operator -/2 called as 10 — »5» Преобразование типов Для преобразования типов в Erlang используются функции стандартной библиотеки (находятся в модуле Erlang). Имена этих функций формируются по следующей схеме: <исходный_тип>_to_<небходимый_тип>. Вот полный перечень таких функций: И пример их использования: 1> erlang: integer_to_list (123). »123» 2> erlang: atom_to_list (false). «false» 3> erlang: iolist_to_atom (123). ** exception error: bad argument in function iolist_to_atom/1 called as iolist_to_atom (123) ``` Проверка типов Большинство типов данных в Erlang можно отличить визуально. Списки заключаются в квадратные скобки, кортежи в фигурные, а строки в двойные кавычки и т.д. Благодаря этому обеспечивается простейшая проверка типов. Например, паттерн для сопоставления [x|xs] может быть сопоставлен только со списком. В противном случае операция закончится неудачей.Но таких элементарных проверок недостаточно. Зачастую нужно проверить, к какому типу относится та или иная переменная. Для этого в Erlang есть ряд функций, которые принимают один аргумент (иногда больше) и если его тип соответствует ожидаемому, возвращают true, иначе false. Эти функции можно использовать в охранных выражениях и проверяемый ими тип понятен из их названия.

Интересный момент: в Erlang нет функции, которая возвращала бы тип переданной переменной (на подобии type_of ()). И на первый взгляд это может показаться странным, медь одна универсальная функция удобнее, чем куча узконаправленных. Ответ на этот вопрос кроется в идеологии языка: программа должна делать только то, что описано явно. Все остальное должно привести к ошибке. Более подробно данный подход будет рассматриваться в главе, посвященной обработке ошибок.Эти типы данных можно комбинировать между собой при помощи списков и кортежей для создания более гибких и универсальных типов.

Что бы быть до конца честным, нужно упомянуть о том, что в Erlang есть возможность явно указывать типы. Этому функционалу будет выделена целая глава, поэтому тут про него рассказывать не будут.

Заключение В этот раз получилось кратко и по делу. Тема простая, но осветить ее нужно.Любые замечания и дополнения жду в комментариях. Об ошибках и опечатках, пожалуйста, сообщайте в личку.

© Habrahabr.ru