Есть парочка языков - SISAL и SAC (Single Assignment C), в них эта задача была решена довольно давно. Код пишется функциональный, без явной линейности в типах, но компилятор видит, где массивы (или frame-ы в случае SISAL) последовательно thread-ятся, и в этих местах повторно использует память. SISAL в какие-то времена был эффективнее Фортрана.
И алгоритмы эти, вроде не такие уж сложные, чтобы не иметь возможности закодировать их в системе типов. В Haskell же есть стрелка -o
? SPJ рассказывал уже. Проверить, к сожалению, пока не могу
Ну Clean примерно так и работает уже тоже сколько-то десятилетий...