reference: https://caiorss.github.io/Functional-Programming/haskell/Haskell.html