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
我理解这种表示:
(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