code: def test_generic_type_cons_hash():
      class A(metaclass=GenericTypeMeta):
          pass
  
      class B(metaclass=GenericTypeMeta):
          pass
  
      assert A[int] is A[int]
      assert A[float] is not A[int]
      assert B[int] is not A[int]
      assert B[A[int], int] is B[A[int], int]
  
      assert FrozenSet[int] is FrozenSet[int]
      assert FrozenSet[B[int]] is FrozenSet[B[int]]
  
      assert Tuple[B[int, int], ...] is Tuple[B[int, int], ...]
  
      assert Union[B[int]] is Union[B[int]]
      assert Union[B[int], B[int]] is Union[B[int]]
  
imports: from typing import Any, FrozenSet, Optional, Tuple, Union
  import pytest
  from multipledispatch import dispatch
  from funsor.ops import AssociativeOp, Op
  from funsor.registry import PartialDispatcher
  from funsor.terms import Cat, Funsor, Number, Reduce, Stack, Variable
  from funsor.typing import GenericTypeMeta, Variadic, deep_isinstance, deep_issubclass, deep_type, get_args, get_origin, get_type_hints, typing_wrap
label_desc: Use image node_id 10 for calling a global function with example usage: test_generic_type_cons_hash() without return types