Я прав?
Не совсем. Вы можете создавать циклические структуры данных, используя чисто функциональное программирование, просто определяя взаимно-рекурсивные значения одновременно. Например, в OCaml:
let rec xs = 0::ys and ys = 1::xs
Тем не менее, можно определить языки, которые делают невозможным создание циклических структур по проекту. Результат известен как однонаправленная куча , и его основным преимуществом является то, что сборка мусора может быть столь же простой, как подсчет ссылок.
Если так, то почему бы и нет?
Некоторые языки запрещают циклы и используют подсчет ссылок. Эрланг и Математика являются примерами.
Например, в Mathematica, когда вы ссылаетесь на значение, вы делаете его глубокую копию, поэтому изменение оригинала не приводит к изменению копии:
In[1] := xs = {1, 2, 3}
Out[1] = {1, 2, 3}
In[2] := ys = xs
Out[2] = {1, 2, 3}
In[3] := xs[[1]] = 5
Out[3] = 5
In[4] := xs
Out[4] = {5, 2, 3}
In[5] := ys
Out[5] = {1, 2, 3}