The main difference between monads, functors, and applicatives is the way they handle function application and composition. Functors are the simplest abstraction, and they let you apply a function to a value in a context, using a method called map. For example, you can map a function that adds one to a list of numbers, and get a new list of numbers. Applicatives are a bit more powerful, and they let you apply a function that is also in a context to a value in a context, using a method called apply. For example, you can apply a list of functions that add different numbers to a list of numbers, and get a new list of numbers. Monads are the most powerful abstraction, and they let you apply a function that returns a value in a context to a value in a context, using a method called flatMap or bind. For example, you can bind a function that returns an option value to an option value, and get a new option value.