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