code: function map(fn, m) {
    if(!isFunction(fn)) {
      throw new TypeError('map: Function required for first argument')
    }
  
    if(isFunction(m)) {
      return compose(fn, m)
    }
  
    if(isArray(m)) {
      return array.map(fn, m)
    }
  
    if(m && isFunctor(m)) {
      return (m[fl.map] || m.map).call(m, fn)
    }
  
    if(isObject(m)) {
      return object.map(fn, m)
    }
  
    throw new TypeError('map: Object, Function or Functor of the same type required for second argument')
  }
docs: map : Functor f => (a -> b) -> f a -> f b