Я не могу понять, почему m1 явно memoized, а m2 не в следующем:
m1 = ((filter odd [1..]) !!)
m2 n = ((filter odd [1..]) !! n)
m1 10000000 занимает около 1,5 секунд при первом вызове, а часть этого на последующих вызовах (предположительно, кэширует список), тогда как m2 10000000 всегда занимает такое же количество времени (перестраивая список с каждым вызовом). Любая идея, что происходит? Существуют ли какие-либо эмпирические правила относительно того, когда и когда GHC будет меморировать функцию? Спасибо.