https://medium.com/@alexandragrosu03/functional-programming-with-haskell-embracing-purity-and-laziness-dfca27816e45