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