foldr lambda 表示 - Haskell

foldr lambda representation - Haskell

我理解这种表示:

(foldr(\x acc -> x+10*acc) 0 n)

但最近我遇到了这个我还没有见过的:

(foldr ((+) . aux . (\(a,b,c) -> c)) 0 list)

欢迎简要说明!

(.)是函数组合运算符,(f . g) x = f (g x),所以

    ((+) . aux . (\(a,b,c) -> c)) (a,b,c) d 
  = ((+) . aux) ((\(a,b,c) -> c) (a,b,c)) d 
  = ((+) . aux) c d
  = (+) (aux c) d 
  = aux c + d

这意味着要使 (foldr ((+) . aux . (\(a,b,c) -> c)) 0 list) 成为类型良好的表达式,我们必须具有类型 list :: [(a,b,c)]aux :: Num t => c -> t;那么列表的折叠 [x1,x2,...,xn] 相当于

aux3 x1 + (aux3 x2 + (... + (aux3 xn + 0) ...))
  where
     aux3 (a,b,c) = aux c