Тип данных — некоторая разновидность данных, которую виртуальная машина BEAM обрабатывает принципиально иным способом. То же: data type.
Например, числа можно складывать, а атомы — нет:
1> 1 + 2.
3
2> one + two.
** exception error: an error occurred when evaluating
an arithmetic expression
in operator +/2
called as one + two
По пиду можно отправить сообщение, а по кортежу — нет:
1> Pid = spawn(lists, seq, [5,10]).
<0.83.0>
2> Pid ! privet.
privet
3> {Pid} ! privet.
** exception error: bad argument
in operator !/2
called as {<0.83.0>} ! privet
И так по всем типам данных. Многие (если не большинство) различий скрыты от нас (пользователей виртуальной машины), но они есть.
any() = any()
— любой допустимый терм. Синоним — term().arity() = arity()
— арность.atom() = atom()
— атом.binary() = <<_:_*8>>
— бинарник (битовая строка, длина которой делится на 8).bitstring() = <<_:_*1>>
— битовая строка.boolean() = true | false
— булевы значения (истина или ложь).byte() = 0..255
— байт.char() = 0..1114111
— символ (ASCII или юникод, представленные целым числом).float() = float()
— вещественное число.function() = function()
— функция.identifier() = pid() | port() | reference()
— уникальный идентификатор сущности (пид, порт или ссылка).integer() = integer()
— целое число.iodata() = iolist() | binary()
— иолист или бинарник.iolist() = maybe_improper_list(byte() | binary() | iolist(), binary() | [])
— иолист.list() = [any()]
— список, который может содержать термы любого типа.list(ContentType) = [ContentType]
— список, который может содержать лишь термы какого-то одного типа.map() = #{any() => any()}
— карта.maybe_improper_list() = maybe_improper_list(any(), any())
— список, который не обязательно заканчивается.maybe_improper_list(ContentType, TerminationType) = maybe_improper_list(ContentType, TerminationType)
— список, который не обязательно заканчивается и который может содержать лишь элементы определённого типа.mfa() = {module(), atom(), arity()}
— МФА, кортеж из трёх элементов, идентификатор Модуль:Функция/Арность.module() = atom()
— модуль.neg_integer() = integer() =< -1
— отрицательное целое.nil() = []
— пустой список.no_return() = none()
— тип, показывающий, что функция никогда не возвращает значение, то есть всегда заканчивающаяся исключением.
— node() = atom()
— нода.non_neg_integer() = integer() >= 0
— не отрицательное число (в т.ч. равное нулю).none() = none()
— тип, нужный для no_return(), который и следует использовать.nonempty_binary() = <<_:8, _:_*8>>
— бинарник, который содержит какие-то данные (не пустой).nonempty_bitstring() = <<_:1, _:_*1>>
— не пустая бинарная строка.nonempty_improper_list(ContentType, TerminationType) = nonempty_improper_list(ContentType, TerminationType)
— maybe_improper_list/2, содержащий какие-то элементы (не пустой).nonempty_list() = [any(), ...]
— не пустой список.nonempty_list(ContentType) = [ContentType, ...]
— не пустой список, который может содержать элементы лишь определённого типа.nonempty_maybe_improper_list() = nonempty_maybe_improper_list(any(), any())
— не пустой maybe_improper_list().nonempty_maybe_improper_list(ContentType, TerminationType) = nonempty_maybe_improper_list(ContentType, TerminationType)
— не пустой maybe_improper_list(ContentType, TerminationType).nonempty_string() = [char(), ...]
— не пустая строка.number() = integer() | float()
— число, целое или вещественное.pid() = pid()
— пид.port() = port()
— порт.pos_integer() = integer() >= 1
— положительное целое число.reference() = reference()
— ссылка.string() = [char()]
— строка.term() = any()
— любой возможный терм. Синоним: any().timeout() = infinity | integer() >= 0
— значение для таймаута в выражении receive.tuple() = tuple()
— кортеж.Data types на официальном сайте.
© Алексей Карманов, 2024.