code: function underline(
      typeInfo,               // :: TypeInfo
      underlineConstraint,    // :: String -> TypeClass -> String -> String
      formatType5
      // :: Integer -> (String -> String) -> Type -> PropPath -> String -> String
    ) {
      var st = typeInfo.types.reduce (function(st, t, index) {
        var formatType4 = formatType5 (index);
        function f(g) {
          return function(type) {
            return B (B (B (when (type.type === FUNCTION)
                                 (parenthesize (_)))))
                     (formatType4 (g));
          };
        }
        st.carets.push (_underline (t, [], W (f (r ('^')))));
        st.numbers.push (_underline (t, [], W (f (function(s) {
          return label (show (st.counter += 1)) (s);
        }))));
        return st;
      }, {carets: [], numbers: [], counter: 0});
  
      return typeSignature (typeInfo) + '\n' +
             _ (typeInfo.name + ' :: ') +
                constraintsRepr (typeInfo.constraints, _, underlineConstraint) +
                joinWith (_ (' -> '), st.carets) + '\n' +
             _ (typeInfo.name + ' :: ') +
                constraintsRepr (typeInfo.constraints, _, K (K (_))) +
                joinWith (_ (' -> '), st.numbers) + '\n';
    }
docs: underline :: ... -> String