Richard Gibson
03/08/2019, 9:49 AM@extension
interface MonadSelective<F>: Selective<F> {
fun M(): Monad<F>
override fun <A, B> Kind<F, A>.ap(ff: Kind<F, (A) -> B>): Kind<F, B> =
M().run { this@ap.ap(ff) }
override fun <A> just(a: A): Kind<F, A> = M().just(a)
override fun <A, B> Kind<F, Either<A, B>>.select(f: Kind<F, (A) -> B>): Kind<F, B> =
M().run { this@select.selectM(f) }
}