code: function Function_(types) {
      var tuples = Z.reduce (function(tuples, t) {
        tuples.push (['$' + show (tuples.length + 1), K ([]), t]);
        return tuples;
      }, [], types);
  
      function format(outer, inner) {
        return when (tuples.length !== 2)
                    (parenthesize (outer))
                    (joinWith (outer (', '),
                               Z.map (function(tuple) {
                                 return when (tuple[2].type === FUNCTION)
                                             (parenthesize (outer))
                                             (inner (tuple[0])
                                                    (show (tuple[2])));
                               }, init (tuples)))) +
               outer (' -> ') +
               inner ((last (tuples))[0])
                     (show ((last (tuples))[2]));
      }
  
      return _Type (FUNCTION,
                    '',
                    '',
                    types.length,
                    format,
                    [AnyFunction],
                    K (K (true)),
                    tuples);
    }
docs: # Function :: NonEmpty (Array Type) -> Type . . Constructor for Function types. . . Examples: . .   - `$.Function ([$.Date, $.String])` represents the `Date -> String` .     type; and .   - `$.Function ([a, b, a])` represents the `(a, b) -> a` type.