Tôi có một số kinh nghiệm khi viết các công cụ nhỏ trong Haskell và tôi thấy nó rất trực quan khi sử dụng, đặc biệt là để viết các bộ lọc (sử dụng interact
) xử lý đầu vào tiêu chuẩn của chúng và chuyển nó thành đầu ra tiêu chuẩn.
Gần đây tôi đã thử sử dụng một bộ lọc như vậy trên một tệp lớn hơn khoảng 10 lần so với thông thường và tôi đã Stack space overflow
gặp lỗi.
Sau khi đọc một số (ví dụ ở đây và ở đây ) tôi đã xác định được hai nguyên tắc để tiết kiệm không gian ngăn xếp (Haskeller có kinh nghiệm, vui lòng sửa cho tôi nếu tôi viết một cái gì đó không đúng):
- Tránh các cuộc gọi hàm đệ quy không đệ quy đuôi (điều này hợp lệ đối với tất cả các ngôn ngữ chức năng hỗ trợ tối ưu hóa cuộc gọi đuôi).
- Giới thiệu
seq
để buộc đánh giá sớm các biểu thức phụ để các biểu thức không tăng quá lớn trước khi chúng bị giảm (điều này đặc trưng cho Haskell, hoặc ít nhất là đối với các ngôn ngữ sử dụng đánh giá lười biếng).
Sau khi giới thiệu năm hoặc sáu seq
cuộc gọi trong mã của tôi, công cụ của tôi sẽ chạy lại một cách trơn tru (cũng trên dữ liệu lớn hơn). Tuy nhiên, tôi thấy mã ban đầu dễ đọc hơn một chút.
Vì tôi không phải là một lập trình viên Haskell có kinh nghiệm, tôi muốn hỏi liệu giới thiệu seq
theo cách này có phải là một thông lệ hay không và thông thường người ta sẽ thấy seq
trong mã sản xuất Haskell. Hoặc có bất kỳ kỹ thuật nào cho phép tránh sử dụng seq
quá thường xuyên mà vẫn sử dụng ít không gian ngăn xếp?