Haskellの関数foldrの型について

sum :: Num a => [a] -> a
sum [] = 0
sum (x : xs) = (+) x (sum xs)

sum = foldr (+) 0

--よって
foldr :: (a -> b -> b) -> a -> [a] -> b

--sumの場合はb=aだけど、b /= aのときってどんなとき?
--そうだlengthを考えてみよう

length :: [a] -> Int
length [] = 0
length (x : xs) = (\_ n -> 1 + n) x (length xs)

--(\_ n -> 1 + n)はλ式だね
(\_ n -> 1 + n) :: Num a => b -> a -> a