Объясняя foldr
новичкам Haskell, каноническое определение
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
Но в GHC.Base, foldr
определяется как
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
Кажется, это определение - оптимизация скорости, но я не понимаю, почему использование вспомогательной функции go
сделает ее быстрее. Исходные комментарии (см. Здесь) указывают на inlining, но я также не вижу, как это определение улучшит inlining.