code: function _determineActualTypes(
      env,            // :: Array Type
      seen,           // :: Array Object
      values          // :: Array Any
    ) {
      var expandUnknown4 = expandUnknown (env);
  
      function refine(types, value) {
        var seen$;
        if (typeof value === 'object' && value != null ||
            typeof value === 'function') {
          //  Abort if a circular reference is encountered; add the current
          //  object to the array of seen objects otherwise.
          if (seen.indexOf (value) >= 0) return [];
          seen$ = Z.concat (seen, [value]);
        } else {
          seen$ = seen;
        }
        var expandUnknown2 = expandUnknown4 (seen$) (value);
        return Z.chain (function(t) {
          return (
            (t.validate (env) (value)).isLeft ?
              [] :
            t.type === UNARY ?
              Z.map (fromUnaryType (t),
                     expandUnknown2 (t.extractors.$1) (t.types.$1)) :
            t.type === BINARY ?
              Z.lift2 (fromBinaryType (t),
                       expandUnknown2 (t.extractors.$1) (t.types.$1),
                       expandUnknown2 (t.extractors.$2) (t.types.$2)) :
            // else
              [t]
          );
        }, types);
      }
  
      return isEmpty (values) ?
        [Unknown] :
        or (Z.reduce (refine, env, values), [Inconsistent]);
    }
docs: _determineActualTypes :: ... -> Array Type