I don’t think that your current version works. It needs parentheses around the function otherwise the function composition is applied in the wrong order. Also, map breaks up the string into characters.
Yes, specifically the list monad. The keyword to look up is “list comprehensions”, which are similar to linq from C#. Really list comprehensions are just the list monad with some bells and whistles
This seems to imply that the method above would be inefficient for large amounts of data, but you don’t say why you think so.
Are you imagining that it will compile to code that loops over the string twice, once for filter and then again for map? If so, you probably don’t have to worry about that, because the optimisation called “stream fusion” will be applied and the map and filter will be combined into a single loop. (See the “Fusion” section of this wiki page for a description.)
Small correction: base still uses short cut fusion a.k.a. foldr/build fusion, because sometimes GHC still isn’t able to optimize stream fusion properly.