Если код, который вы разместили, на самом деле то, что вы делаете, то вы делаете это неправильно! :-). Если вы собираетесь запоминать рекурсивную функцию, вам нужно, чтобы вызовы рекурсивной версии возвращались в запомненную версию. Так, например .:
editDistance (x:xs) (y:ys)
| x == y = elm xs ys
| ...
В противном случае вы выполняете полностью рекурсивные вычисления и сохраняете только конечный результат. Вам нужно хранить промежуточные результаты.
Здесь есть еще одна проблема. Таблица memo для elm не должна зависеть от ее аргументов (в идеале вы не должны даже упоминать аргументы, поэтому вы не зависите от того, насколько компилятор достаточно умен, чтобы выяснить зависимости). Если таблица памятки зависит от аргументов, то вам нужно создать новую таблицу для каждого отдельного аргумента, и нам нужно совместно использовать таблицу для всех аргументов. Вы можете попробовать что-то глупое, например, запоминать всю структуру аргументов:
elm = M.memo2 (M.list M.char) (M.list M.char)
Посмотрите, ускоряет ли это его (включая прежний трюк) Затем вы можете перейти к попытке использовать только длины вместо всей структуры списка для дополнительного увеличения.
Надеюсь, это помогло.