foldr lambda表示 - Haskell

时间:2015-01-25 15:12:44

标签: haskell

我理解这种表述:

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

但是最近我遇到了一个我还没见过的那个:

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

简短的解释非常欢迎!

1 个答案:

答案 0 :(得分:5)

(.)是函数组合运算符(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