Learning Functional Programming in Go
上QQ阅读APP看书,第一时间看更新

The final HOF example

Our final HOF example is a doozy. We generate 14 cars, filter ByDomestic, map them with an Upgrade function, filter them by ByHasNumber, and reduce them to a collection of JSON strings:

PrintCars("GenerateCars(1, 14), Domestic, Numeric, JSON",
cars.GenerateCars(1, 14).
Filter(ByDomestic()).
Map(Upgrade()).
Filter(ByHasNumber()).
Reduce(JsonReducer(cars), Collection{}))

The output of this is as follows:

GenerateCars(1, 14), Domestic, Numeric, JSON
-----------------------
car: {"car": {"make": "Ford", "model": " F-150 XL"}}
car: {"car": {"make": "GM", "model": " Hummer H2 X"}}
car: {"car": {"make": "GM", "model": " Hummer H3 X"}}

That's six lines of code. How many lines of code do you think it would take to do this using an imperative coding style?

"This program is already so bloated a little more bloat won't hurt." No. Eventually, it will. And then it will be too late to fix."

- Rob Pike

"The problem is that adding more bloat is often much easier than integrating properly, which requires thought, time, and hard decisions." 

- Roger Peppe