abstract over F[_] and A
option support using null and non-null