Learn Physics With Functional Programming : A Hands-on Guide to Exploring Physics with Haskell