На первый взгляд, нет никаких причин, по которым этот сборщик мусора не будет выполняться должным образом, и почему TCO не будет выполняться.
В общем, о tco и сборке мусора следует думать по-другому.в Хаскеле - много связанных вопросов, перечисленных здесь на SO, кажутся полезными.По сути, вы хотите представить операционную семантику GHC Haskell как ленивое сокращение графов.
Представьте, что у вас в памяти просто есть весь AST с дополнительными стрелками от каждого использования имени до его определения, и вы запрашиваетезначение «основной».Теперь, чтобы получить это, вам нужно взглянуть на значение первой функции, вызванной в main, и подставить его в, что, в свою очередь, означает, что вам нужно искать следующую вещь, которую нужно оценить, и т. Д. Теперь в какой-то моментэто сокращение, вы заметите, что вещи, которые раньше указывались как выражения, теперь были вычислены и заменены значениями, которые они представляют.Тогда эти выражения могут получить мусор.Между тем, трасса, которую вы получили от вершины графика до того, что вы сейчас оцениваете, является «стеком».Так что, если вы хотите оценить структуру, вам нужно оценить «внутри» этой структуры, то это увеличит ваш стек.
Выше приведено небрежно и волнисто, но может помочь придать интуицию.