def narrow[A, B](f: A => Attempt[B], g: B => A): F[B]
Transforms supplied F[A] to an F[B] using two functions, A => Attempt[B] and B => A.
The supplied functions form an injection from B to A. Hence, converting a F[A] to a F[B] converts from a larger to a smaller type. Hence, the name narrow.
def widen[A, B](f: A => B, g: B => Attempt[A]): F[B]
Transforms supplied F[A] to an F[B] using two functions, A => B and B => Attempt[A].
The supplied functions form an injection from A to B. Hence, converting a F[A] to a F[B] converts from a smaller to a larger type. Hence, the name widen.