/** * Expanded: (a: A) => Functor */ export type FunctorFunc = (a: A) => Functor; /** * Expanded: (a: A) => (a: B) => Applicative */ export type ApplicativeFunc = (a: A) => FunctorFunc; /** * Expanded: Monad<(a: A) => Monad> */ export type MonadFunc = Monad>; /** * Functor interface. */ export interface Functor { map (f: (a: A) => B): Functor; fmap (f: FunctorFunc): Functor; } /** * Applicative interface, extends Functor interface. */ export interface Applicative extends Functor { applies (f: ApplicativeFunc): (ab: Applicative) => Applicative; } /** * Monad interface: extends Applicative and Functor interfaces. */ export interface Monad extends Applicative { mbind (f: MonadFunc): Monad; }