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