code: function liftA2(fn, x, y) {
    if(!isFunction(fn)) {
      throw new TypeError('liftA2: Function required for first argument')
    }
  
    if(!((isApply(x) || isArray(x)) && isSameType(x, y))) {
      throw new TypeError('liftA2: Applys of same type required for last two arguments')
    }
  
    if(isArray(x)) {
      return ap(y, map(fn, x))
    }
  
    return x.map(fn).ap(y)
  }
docs: liftA2 :: Applicative m => (a -> b -> c) -> m a -> m b -> m c