Validation.<<*>>

def s<<*>>[Y](f: Validation[E, X => Y])
            (implicit s: Semigroup[E]): Validation[E, Y]
    = (this, f) match {
      case (Failure(e1), Failure(e2)) => Failure(s append (e1, e2))
      case (Failure(e1), Success(_))  => Failure(e1)
      case (Success(_), Failure(e2))  => Failure(e2)
      case (Success(x), Success(k))   => Success(k(x))
    }