2015-01-25 2 views
1

Я понимаю, это представление:foldr лямбда-представление - Haskell

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

Но в последнее время я сталкивался с этим, что я еще не видел:

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

Краткое объяснение было бы более чем приветствовать!

+1

'.' является оператором композиции функций. '(f. g) x == f (g x)'. –

+1

Почему бы кто-нибудь это делать не по себе. Кроме того, что он не читается, он также неэффективен. – dfeuer

+0

, который один из 2 является неэффективным? Я считаю, что второй немного более неэффективен, но это было любопытно. Это имеет смысл сейчас, хотя :) – skills

ответ

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 
+1

Большое спасибо за объяснение :) – skills

Смежные вопросы