У меня вопрос о реализации кэширования (memoization) с использованием массивов в Haskell. Работает следующий шаблон:
f = (fA !)
where fA = listArray...
Но это не так (скорость программы предполагает, что массив получает воссозданный каждый вызов или что-то еще):
f n = (fA ! n)
where fA = listArray...
Определение fA вне предложения where (в "глобальной области видимости" ) также работает с любым шаблоном.
Я надеялся, что кто-то может указать мне на техническое объяснение того, какая разница между двумя этими двумя шаблонами.
Обратите внимание, что я использую последний GHC, и я не уверен, что это просто особенность компилятора или часть самого языка.
ИЗМЕНИТЬ:! используется для доступа к массиву, поэтому fA! 5 означает fA [5] в синтаксисе С++. Мое понимание Haskell заключается в том, что (fA!) N будет таким же, как (fA! N)... и для меня было бы более обычным писать "f n = fA! N" (без круглых скобок). Во всяком случае, я получаю такое же поведение независимо от того, как я заключу в скобки.