add functor
add type list