Как правильно сделать subj? Читал Tying the Knot и то что гуглится в haskell-cafe. Тут, вроде как, два варианта - ввести этот объект как базовый АТД, либо моделировать его с помощью монад. Интересует именно первое (а с помощью монад - понятно что можно что угодно имитировать, хоть мутабельную flat memory, хоть DFA, но это будет просто модель). Т.е.
data Ring a = Ring (Ring a) a (Ring a)
Тут всё нормально получается, но смущает следующее:
* Допустим у нас есть кольцо из 5 элементов, я так понимаю, что если мы по нему пройдёмся 50 раз то в памяти помимо этих 5 элементов создаться ещё 45? В языках вроде Си где есть доступ к такой вещи как память (просто возможность ссылаться на её куски) такой проблемы не возникает.
* И ещё - если мы возьмём кольцо и «изменим» (не в смысле присваивания, а в смысле создания нового кольца) в нём элемент перед первым (который суть последний) то другой последний не изменится. Вообще - «изменение» одного элемента не меняет взаимно периодичных с ним. Как вообще проделывать эту операцию?
Это и понятно - АТД Ring ничем не отличается от того же АТД Tree - в типе никак не заложена его конечность (и замкнутость). Если тут какой-нибудь трюк, чтобы АТД получался компактным по памяти?
Если нет, то - нет ли у GHC дружественного к пользователю способа введения примитивов? ;)
Ну и последний вопрос - можно ли ввести какой-нибудь такой синтаксис для своих типов:
<1, 2, 3>
?