我理解这种表述:
(foldr(\x acc -> x+10*acc) 0 n)
但是最近我遇到了一个我还没见过的那个:
(foldr ((+) . aux . (\(a,b,c) -> c)) 0 list)
简短的解释非常欢迎!
答案 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