Monads are functional programming abstractions that allow computations to be structured and composed in a purely functional way. They provide a way to compose functions of different types by lifting them to work on a computational context. Functors are containers that lift functions of one argument to work on their context. Applicative functors generalize this to lift functions of multiple arguments. Monads build on applicative functors by allowing computations to be chained sequentially through flatMap. In Scala, monadic code can be written using for-comprehensions, which recognize monadic patterns.