Indexing in a monad.
The monad allows operations to be strict in the vector when necessary.
Suppose vector copying is implemented like this:
copy mv v = ... write mv i (v ! i) ...
For lazy vectors, v ! i
would not be evaluated which means
would unnecessarily retain a reference to v
in each element written.
, copying can be implemented like this instead:
copy mv v = ... do
x <- indexM v i
write mv i x
Here, no references to v
are retained because indexing (but
the elements) is evaluated eagerly.