code: function _Type(
      type,       // :: String
      name,       // :: String
      url,        // :: String
      arity,      // :: NonNegativeInteger
      format,
      // :: Nullable ((String -> String, String -> String -> String) -> String)
      supertypes, // :: Array Type
      test,       // :: Any -> Boolean
      tuples      // :: Array (Array3 String (a -> Array b) Type)
    ) {
      var t = Object.create (Type$prototype);
      t._test = test;
      t._extractors = tuples.reduce (function(_extractors, tuple) {
        _extractors[tuple[0]] = tuple[1];
        return _extractors;
      }, {});
      t.arity = arity;  // number of type parameters
      t.extractors = Z.map (B (toArray), t._extractors);
      t.format = format || function(outer, inner) {
        return Z.reduce (function(s, tuple) {
          return s +
                 outer (' ') +
                 when (tuple[2].arity > 0)
                      (parenthesize (outer))
                      (inner (tuple[0]) (show (tuple[2])));
        }, outer (name), tuples);
      };
      t.keys = tuples.map (function(tuple) { return tuple[0]; });
      t.name = name;
      t.supertypes = supertypes;
      t.type = type;
      t.types = tuples.reduce (function(types, tuple) {
        types[tuple[0]] = tuple[2];
        return types;
      }, {});
      t.url = url;
      return t;
    }
docs: _Type :: ... -> Type