use data.functor