     (all zipWith typeEq, a.constraints, b.constraints) and
       (typeEq a.type, b.type)
   else if a instanceof ClassConstraint and b instanceof ClassConstraint
-    a.className is b.className and (all zipWith typeEq, a.types, b.types)
+    a.className is b.className and typeEq a.types, b.types
+  else if a instanceof Types and b instanceof Types
+    all zipWith typeEq, a.types, b.types
   else
     no
 

  [(filter fn, list), (filter ((x) -> not (fn x)), list)]

_notEmpty = (x) -> x.length > 0

_is = (x) -> !!x


    [o t r] g
  """
  "o", 4

  'multiple generic constraints'
  """
    Show (class [a]
      show (fn [x] (: (Fn a String))))

    show-string (instance (Show String)
      show (fn [x] x))

    f (fn [pair]
      [(show a) (show b)]
      [a b] pair)

    [x y] (f ["A" "B"])
  """
  """x""", "A"
  # The following doesn't work because the Collection type class specifies
  # that the constructor takes only one argument.
  #
