Assuming we define functional as referential transparent and imperative in turn as referential opaque.
Then, I think there are two different aspects of the problem:
- There is the identity of each object in your program (e.g. a key, reference or pointer), regardless of its value.
- And there are the versions of values each object has / had.
Imperative tracks identities but no versions while functional tracks versions but no identities. Ideally the program would run in a VCS so that one could track both versions and identities.
Then, I think there are two different aspects of the problem:
- There is the identity of each object in your program (e.g. a key, reference or pointer), regardless of its value.
- And there are the versions of values each object has / had.
Imperative tracks identities but no versions while functional tracks versions but no identities. Ideally the program would run in a VCS so that one could track both versions and identities.