Как списки реализованы в Haskell (GHC)?
Мне просто было любопытно узнать о некоторых точных деталях реализации списков в Haskell (ответы, специфичные для GHC, хороши) - это наивные связанные списки или у них есть какие-то специальные оптимизации? Более конкретно:
Делатьlength
а также(!!)
(например) должны перебирать список?Если так, их значения кэшированы каким-либо образом (то есть, если я вызываюlength
дважды, придется ли повторять оба раза)?Включает ли доступ к задней части списка итерацию по всему списку?Запоминаются ли бесконечные списки и их списки? (т.е. дляfib = 1:1:zipWith (+) fib (tail fib)
Будет ли каждое значение вычисляться рекурсивно, или оно будет полагаться на предыдущее вычисленное значение?)Любые другие интересные детали реализации будут высоко оценены. Заранее спасибо!