def point: () => F[Unit]
def pure[A]: A => _ => F[A]
def raiseError[A]: E => _ => F[A]
def zero[A]: () => _ => F[A]
def map[A, B]: (A => B) => F[A] => F[B]
def flatMap[A, B]: (A => F[B]) => F[A] => F[B]
def ap[A, B]: (F[A => B]) => F[A] => F[B]
def handleErrorWith: (E => F[A]) => F[A] => F[A]
def product[A, B]: F[B] => F[A] => F[(A, B)]
def combine[A]: F[A] => F[A] => F[A]
def tailRec[A]: (A => F[A Xor B]) => F[A] => F[B]
def contramap[A, B]: (B => A) => F[A] => F[B]
def imap[A, B]: (A => B, B => A) => F[A] => F[B]
def cobind[A, B]: (F[A] => B) => F[A] => F[B]
sealed trait Op[F[_], A, B]
def point: () => F[Unit]
def zero[A]: () => Op[F, Unit, A]
def pure[A]: A => Op[F, Unit, A] = point.map(_ => a)
def raiseError[A]: E => Op[F, Unit, A]
def map[A, B]: (A => B) => Op[F, A, B]
def flatMap[A, B]: (A => F[B]) => Op[F, A, B]
def ap[A, B]: (F[A => B]) => Op[F, A, B]
def handleErrorWith: (E => F[A]) => Op[F, A, A]
def product[A, B]: F[B] => Op[F, A, (A, B)]
def combine[A]: F[A] => Op[F, A, A]
def tailRec[A]: (A => F[A Xor B]) => Op[F, A, B]
def contramap[A, B]: (B => A) => Op[F, A, B]
def imap[A, B]: (A => B, B => A) => Op[F, A, B]
def cobind[A, B]: (F[A] => B) => Op[F, A, B]