【发布时间】:2025-12-27 18:10:06
【问题描述】:
在向 Haskell 新手解释 foldr 时,规范定义是
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 会使其更快。源 cmets (see here) 提到了内联,但我也看不出这个定义将如何改进内联。
【问题讨论】:
-
一个细节还没有提到:ghc 仅在函数完全应用时内联一个函数,语法,在它的左侧。如果您习惯于考虑柯里化和创建漂亮的无点式代码,这将是非常奇怪和丑陋的。这就是为什么您有时会在优化代码中看到
=右侧的愚蠢 lambda。