> My understanding is that APL permits mutable state and side effects ... If you're modifying the contents of an array in-place, I don't think it's reasonable to consider that functional.
a←'hello'
a[1]←'c'
This does _not_ modify the array in-place. It's actually the same as:
a←'hello'
a←'c'@1⊢a
which is more obviously functional. It is easy to convince yourself of this: