package blitz.func class Monad internal constructor( val impure: () -> O ) fun unit(v: O): Monad = Monad { v } fun unit(): Monad = Monad { } fun Monad.bind(op: (I) -> O): Monad = Monad { op(this@bind.impure()) }