Monads achieve this by providing their own data type (a particular type for each type of monad), which represents a specific form of computation, along with one procedure to wrap values of "any" basic type within the monad (yielding a monadic value) and another to compose functions that output monadic values (called monadic functions).