export declare type FunctorFunc = (a: A) => Functor; export declare type ApplicativeFunc = (a: A) => FunctorFunc; export declare type MonadFunc = Monad>; export interface Functor { map(f: (a: A) => B): Functor; fmap(f: FunctorFunc): Functor; } export interface Applicative extends Functor { applies(f: ApplicativeFunc): (ab: Applicative) => Applicative; } export interface Monad extends Applicative { mbind(f: MonadFunc): Monad; }