Спецификация списка с более чем одним определенным элементом - PullRequest
2 голосов
/ 05 октября 2011

Я проанализировал список json, и он выходит с каждым элементом вроде:

{struct,
 [
  {<<"name">>, "<<a name>>"},
  {<<"id">>, "<<an id>>""}
 ]
}

Я хотел бы указать это как тип, но я получаю ошибку со следующим, предположительно, потому что я использую два элемента в определении списка:

-type user_data() :: {struct, [{Name_key::Binary, Name_value::Binary},{ID_key::Binary, ID_value::Binary}]}.

Есть ли способ сделать то, что я пытаюсь сделать?

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Вы можете сделать

-type user_data() :: {struct, [{Name_key::binary(), Name_value::binary()}|{ID_key::binary(), ID_value::binary()}]}.

означает список, каждый элемент которого является либо {Name_key::binary(), Name_value::binary()}, либо {ID_key::binary(), ID_value::binary()}. Это не совсем то, что вы хотите, но может быть достаточно хорошим.

1 голос
/ 05 октября 2011

Как вы указали, при указании типов элементов в списках может быть указан только один тип.Дополнительные типы могут быть добавлены с использованием синтаксиса объединения, но внутренне это не сохранит информацию о порядке элементов в списке.

Поэтому ваша лучшая ставка выглядит примерно так:

-type user_data :: {struct, [{Key::binary(), Value::binary()}]}.

Вы также можете попробовать:

-type      field() :: {Key::binary(), Value::binary()}.
-type name_field() :: field(). % Key is <<name>>
-type   id_field() :: field(). % Key is <<id>>
-type     fields() :: [name_field() | id_field()].
-type  user_data() :: {struct, fields()}.

В последнем примере хранится вся информация, и вы можете расширить ее разумным способом.

0 голосов
/ 06 октября 2011

В большинстве систем типов список типа [A, B] считается мономорфным в том смысле, что A и B должны иметь одинаковый тип.Это относится и к системе типа диализатора Erlangs.чтобы можно было представить это как отдельные типы, представление должно быть произведением типов, сформированных с помощью кортежа {A, B}, который неявно также говорит, что всегда есть точно два элемента, а именно A и B иони всегда встречаются вместе.

Однако существуют системы типов, которые позволяют иметь полиморфные списки.Одним из способов является кодирование элементов как экзистенциальных типов.Представьте, что элементы A и B «упакованы» таким образом, что их внутреннее представление непрозрачно, и вы можете манипулировать ими только через некоторые предопределенные функции, определенные пакетом.Другой способ - использовать расширенные системы типов, обычно с зависимыми типами, где ваш тип определяется структурой списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...