Title: WTFunctional: Modifying yout WTF-Count using functional programming Author: Oliver Rümpelein html header: <link rel="stylesheet" href="http://yandex.st/highlightjs/7.3/styles/default.min.css"> <script src="http://yandex.st/highlightjs/7.3/highlight.min.js"></script> <script>hljs.initHighlightingOnLoad();</script> # [%title] # ## Content ## * Dafunc? Understanding functional programming with Haskell. + no side-effects, no mutability => maintainability + recursion + functions as first class “objects”: i.e. C++, 5; is a valid statement + lambdas + lists, maps, filters, folds + currying => just convenience + code example: Pythagoraian triangles, bubble sort * Phuncy: The pythonic way is functional! + Not strictly functional - recursion + fafco - map, fold => example (sum of squares?) + python lambda syntax: lambda a,b: a+b + don't return lists, but iterators! + fold with reduce + Note: 2: map, filter, reduce, list comprehension 3: map, filter, functools.reduce(), list comprehension + The python2 to 3 page states: “Removed `reduce()`. Use `functools.reduce()` if you really need it; however, 99 percent of the time an explicit `for` loop is more readable.” + Why use it? => Multi-processing, WTF Count. ```python a = list(range(10)) b = 0 for i in a: b += i**2 print(b) ``` vs. ```python from functools import reduce print(reduce(lambda x,y: x+y,map(lambda x: x**2,range(10)))) ``` + currying: not really, but binding via lambdas or functools.partial() or https://mtomassoli.wordpress.com/2012/03/18/currying-in-python/ + decorators! + still FP has advantages and is heavily used, i.e. in genomics (works on tons of lengthy lists) * FunC++tional: On the fast lane + "Classical" C++ has some functional stuff, bust i.e. no lambdas (hardly usable) + Changed with the new C++11-standard + Buzzwords: + `map` defines a Datatype in C++! + lambdas in C++ ```[](int x, int y) { return a<b;} ;``` [] can be used to capture variables, i.e. by reference or value + `std::for_each` from `algorithm`: Apply `void fun(T &a)` to iterator containing `T` values + `std::transform` from `algorithm`: same as for_each, but stores return value in another range + `std::accumulate` from `numeric`: Wants binary operation, i.e. `std::minus<int>`