I guess the difference between lambdas and top level functions is that it's more reasonable to assume top level functions must expect to deal with every value (particularly when they're part of an interface), whereas inline lambdas often can reasonably make assumptions about their input.
For example, whilst:
capitalise (l:ls) = (toUpper l):ls
you could argue as bad code because it fails on the empty string case, something like:
capitalisedDictionary = map (\(l:ls) -> (toUpper l):ls) myDictionary where
myDIctionary = ...
you could argue is perfectly reasonable code. when the programmer knows that "myDictionary" doesn't contain any empty strings (perhaps because of checking that's already occurred).
You could even go further here, and suggest that GHC should have an option "don't check incomplete patterns", allowing GHC to assume strings are non empty in this case, blowing up spectacularly C style at run time if this is incorrect with either a seg fault or launching the nuclear missiles, although this could allow optimisation opportunities (does GHC already have such an option?).