Как говорили другие, такого оператора нет, потому что в этом нет особого смысла. Я на самом деле думаю, что это хорошо, потому что легче понять, что операция не будет эффективной. На практике вам не нужен оператор - обычно есть лучший способ написать то же самое.
Типичный сценарий: Я думаю, что типичный сценарий, в котором вы можете подумать, что вам нужно добавить элементы в конец, настолько распространен, что его полезно описать.
Добавление элементов в конец кажется необходимым, когда вы пишете хвостовую рекурсивную версию функции, используя параметр аккумулятора . Например, (неэффективная) реализация функции filter
для списков будет выглядеть так:
let filter f l =
let rec filterUtil acc l =
match l with
| [] -> acc
| x::xs when f x -> filterUtil (acc @ [x]) xs
| x::xs -> filterUtil acc xs
filterUtil [] l
На каждом шаге нам нужно добавить один элемент в аккумулятор (который хранит элементы, которые будут возвращены в результате). Этот код можно легко изменить, чтобы использовать оператор ::
вместо добавления элементов в конец списка acc
:
let filter f l =
let rec filterUtil acc l =
match l with
| [] -> List.rev acc // (1)
| x::xs when f x -> filterUtil (x::acc) xs // (2)
| x::xs -> filterUtil acc xs
filterUtil [] l
В (2) мы теперь добавляем элементы в начало аккумулятора, и когда функция собирается вернуть результат, мы обращаемся к списку (1), который намного эффективнее, чем добавление элементов по одному один.