I Compile-time resolution ========================= 1. an isolated name, where the argument is implicitly determined by the result context @max 2. a direct application to a manifest type @max( int ) 3. constraining a type variable; the application is implicitly performed at the call site as in (2) forall( type T | { T @max( T ); } ) T x( T t ); II Run-time resolution ====================== 1. an indirect reference, where the argument is implicitly determined by the result context attr_var = &@max; x = (*attr_var); 2. an indirect application to a manifest type (*attr_var)( int ) 3. a direct application to a type variable @max( T ) Under what circumstances can this be done at compile/link time? III Declaration forms ===================== 1. monomorphic with implicit argument int @max; 2. monomorphic with explicit argument int @max( int ); 3. polymorphic forall( type T | constraint( T ) ) int @attr( T );