Functional Programming With Abstract Algebra