import { Applicative } from './applicative';
export declare abstract class Monad<a> extends Applicative<a> {
    abstract bind<b>(f: (a: a) => Monad<b>): Monad<b>;
    abstract join(this: Monad<Monad<a>>): Monad<a>;
}
export declare namespace Monad {
    function Return<a>(a: a): Monad<a>;
    function bind<a, b>(f: (a: a) => Monad<b>, m: Monad<a>): Monad<b>;
    function sequence<a>(fm: Monad<a>[]): Monad<Iterable<a>>;
}
