Toda Monad é um tipo genérico. Para um tipo genérico ser uma monad, ele tem que suportar a seguinte "interface":
Dado que nossa monad é o tipo M onde A é algum tipo de parâmetro, devem existir as seguintes funçÕes:
function pure(A): M<A>
function bind<B>(M<A>, A -> M<B>): M<B>
A função pure "injeta" um valor dentro da monad com contexto "neutro".