Я новичок в Haskell и понимаю, что это (в основном) чистый функциональный язык, который имеет то преимущество, что результаты для функций не будут меняться при нескольких оценках. Учитывая это, я озадачен тем, почему я не могу легко отметить функцию таким образом, чтобы она запоминала результаты ее первой оценки и не должна оцениваться снова каждый раз, когда требуется ее значение.Есть ли способ «сохранить» результаты в Haskell?
В Mathematica, например, есть simple idiom для достижения этого:
f[x_]:=f[x]= ...
но в Haskell, самые близкие вещи, которые я нашел это something like
f' = (map f [0 ..] !!)
where f 0 = ...
f n = f' ...
, которые в дополнение к тому, гораздо менее понятным (и, по-видимому, ограниченным аргументами Int
?) не сохраняет (кажется) сохранение результатов в рамках интерактивного сеанса.
По общему признанию (и ясно), я не совсем понимаю, что здесь происходит; но наивно, похоже, Хаскель должен иметь какой-то способ, на уровне определения функции, из
- воспользовавшись тем, что его функции являются функции и пропускающие повторное вычисление их результатов, когда они были вычислены , и
- , указывающий на желание сделать это на уровне определения функции с простой и чистой идиомой.
Есть ли способ сделать это в Haskell, которого я не хватает? Я понимаю (вроде), что Haskell не может хранить оценки как «состояние», но почему он не может просто (по сути) переопределить оцениваемые функции как их вычисленное значение?
Это вырастает из this question, в которых отсутствие этой функции приводит к ужасной производительности.
GHC решил, что вы, вероятно, используете слишком много памяти, если вспомнили о приложении-функции и, вероятно, правильно. Однако он помнит константы. – PyRulez
Еще одна реализация haskell будет бесплатной для memoize функций, если она понравится. – PyRulez