Как списки реализованы в Haskell (GHC)?

Мне просто было любопытно узнать о некоторых точных деталях реализации списков в Haskell (ответы, специфичные для GHC, хороши) - это наивные связанные списки или у них есть какие-то специальные оптимизации? Более конкретно:

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

Любые другие интересные детали реализации будут высоко оценены. Заранее спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос