Tôi thường cần tạo một chức năng cốt lõi được sử dụng ở nhiều nơi có thể cấu hình được - tức là nó có thể sử dụng thuật toán A hoặc thuật toán B tùy thuộc vào công tắc dòng lệnh; hoặc có nó in thông tin chi tiết hơn để stdout nếu cờ 'debug' được thiết lập bằng cách nào đó.Cách thích hợp để xử lý cờ toàn cầu trong Haskell
Tôi nên triển khai cờ toàn cầu như thế nào?
Tôi thấy 4 tùy chọn, tất cả đều không thực sự tốt.
1) Đọc đối số dòng lệnh từ hàm - xấu, vì cần IO đơn nguyên và các hàm tính toán lõi đều thuần, tôi không muốn nhận IO trong đó;
2) Truyền tham số từ chính/IO tới chức năng 'lá' cần thay đổi hành vi - hoàn toàn không sử dụng được, điều đó có nghĩa là thay đổi hàng chục hàm không liên quan trong các mô-đun khác nhau để chuyển tham số này, và Tôi muốn thử các tùy chọn cấu hình như vậy nhiều lần mà không phải thay đổi mã gói mỗi lần;
3) Sử dụng không an toànPerformIO để nhận biến toàn cục thực sự - cảm thấy xấu xí và quá mức cần thiết cho một vấn đề đơn giản như vậy;
4) Ngay ở giữa funcion có mã cho cả hai tùy chọn và nhận xét một trong số chúng. Hoặc có các hàm do_stuff_A và do_stuff_B, và thay đổi cái nào được gọi là tùy thuộc vào hàm toàn cục 'needDebugInfo = True' nói. Đó là những gì tôi đang làm bây giờ cho debuginfo, nhưng nó không thể được thay đổi w/o biên dịch lại, và nó không thực sự là cách tốt nhất có sẵn ...
Tôi không cần hoặc muốn toàn cầu có thể thay đổi nhà nước - Tôi muốn có một lá cờ toàn cầu đơn giản là không thay đổi trong thời gian chạy nhưng có thể bằng cách nào đó được thiết lập khi chương trình được khởi chạy. Có bất kỳ lựa chọn nào không?