Есть ли способ добавить пустой элемент в список в OCaml? - PullRequest
2 голосов
/ 06 апреля 2019

Рассмотрим данный список [3;4;5].
Теперь я хочу выполнить x::[3;4;5];;
Есть ли в OCaml значение x, которое снова приводит к результату [3;4;5]?

Ответы [ 4 ]

7 голосов
/ 06 апреля 2019

Нет, результатом x::xs всегда будет список, содержащий один элемент больше, чем xs.

Если вы хотите условно добавить элемент к списку, выдолжен сделать if condition then x::xs else xs.То есть, используйте :: только в том случае, если у вас есть элемент, который вы хотите добавить.

4 голосов
/ 06 апреля 2019

Другие ответы также верны, но я подумал, что было бы полезно взглянуть на то, как определяется list.

Под капотом list примерно выглядит следующим образом:

type 'a list =
  | []
  | ( :: ) of 'a * 'a list

Это подразумевает две вещи:

  1. ( :: ) всегда добавляет элемент к существующему списку.
  2. Элементы списка должны быть одного типа.

Так что, если у вас уже есть список [3; 4; 5], тогда x должен быть int для x :: [3; 4; 5] для компиляции.

1 голос
/ 08 апреля 2019

Нет, :: всегда создает новый список, который на один элемент длиннее.

Вам может потребоваться @, который добавляет один список к другому (на самом деле он добавляет первый список передвторой).Для этого у вас есть [] @ list ==> list.

1 голос
/ 06 апреля 2019

Нет, они никогда не могут быть равны - первый - это список длиной 3, другой - список длиной 4.

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