wtfunctional/Notes.md
Oliver Rümpelein 4110c30cc6 Finished haskell-part
* Notes now is multimarkdown
 * Notes has "checklist"
 * Haskell examples are complete
2016-04-21 15:59:10 +02:00

2.6 KiB

Title: WTFunctional: Modifying yout WTF-Count using functional programming
Author: Oliver Rümpelein html header:

[%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
    • lambda syntax
    • map, fold => example (sum of squares?)
      • python lambda syntax: lambda a,b: a+b

      • fold with reduce

      • don't return lists, but iterators!

      • 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.

        a = list(range(10))
        
        b = 0
        for i in a:
            b += i**2
        print(b)
        

        vs.

        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)
  • FunCtional++: 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>