У мене є досвід написання невеликих інструментів у Haskell, і мені здається, що це дуже інтуїтивно використовувати, особливо для запису фільтрів (за допомогою interact
), які обробляють їх стандартний вхід і передають його на стандартний вихід.
Нещодавно я спробував використати один такий фільтр у файлі, який був приблизно в 10 разів більшим, ніж зазвичай, і я отримав Stack space overflow
помилку.
Прочитавши (наприклад, тут і тут ), я визначив два вказівки щодо економії місця в стеці (досвідчені Haskellers, будь ласка, виправте мене, якщо я напишу щось, що не відповідає):
- Уникайте рекурсивних викликів функцій, які не є рекурсивними (це справедливо для всіх функціональних мов, які підтримують оптимізацію хвостових викликів).
- Введіть,
seq
щоб змусити раннє оцінювання суб-виразів, щоб вирази не зростали занадто великими до їх скорочення (це характерно для Haskell або, принаймні, для мов, що використовують ледачу оцінку).
Після введення п’яти-шести seq
викликів у мій код мій інструмент знову працює безперебійно (також на великих даних). Однак я вважаю, що оригінальний код був трохи читабельнішим.
Оскільки я не є досвідченим програмістом Haskell, я хотів запитати, чи введення seq
таким способом є звичайною практикою, і як часто ви бачите seq
у виробничому коді Haskell. Або є якісь методи, які дозволяють уникнути seq
занадто частого використання і все ж використовувати мало місця у стеці?