Tôi đang tìm cách viết một mô-đun chung cho phép các chương trình Haskell tương tác với Cassandra. Mô-đun sẽ cần phải duy trì trạng thái riêng của nó. Ví dụ, nó sẽ có một hồ bơi kết nối và một danh sách các cuộc gọi lại được gọi khi một bản ghi mới được lưu. Làm thế nào tôi nên cấu trúc mã để module này có thể duy trì trạng thái của nó? Dưới đây là một số phương pháp tôi đã cân nhắc. Có phải tôi đang trên đường ray bên phải không? (Tôi mới đến Haskell và vẫn đang học hỏi những cách tốt nhất để suy nghĩ về mặt chức năng.)Làm thế nào để bạn cấu trúc một mô-đun stateful trong Haskell?
Lựa chọn 1:
Module chạy trong một (StateT s IO) đơn nguyên, trong đó s là trạng thái toàn cầu cho toàn bộ chương trình sử dụng mô-đun Cassandra. Tất nhiên, vì mô-đun Cassandra có thể được sử dụng bởi nhiều chương trình, chi tiết về những gì trong s nên được ẩn với mô-đun Cassandra. Các mô-đun sẽ phải xuất khẩu một loại lớp cho phép nó để trích xuất CassandraState từ s và đẩy một CassandraState mới trở lại vào s. Sau đó, bất kỳ chương trình nào sử dụng mô-đun sẽ phải làm cho trạng thái chính của nó trở thành thành viên của lớp loại này.
Tùy chọn 2:
Mô-đun chạy trong đơn vị (StateT CassandraState IO). Mỗi khi ai đó gọi một hành động trong mô-đun, họ sẽ phải giải nén CassandraState từ bất cứ nơi nào mà nó có nó stashed, gọi hành động với runState, và lấy trạng thái kết quả và stash nó lại (bất cứ nơi nào).
Tùy chọn 3:
Không đặt các chức năng của mô đun Cassandra trong trạng thái StateT. Thay vào đó, có người gọi một cách rõ ràng vượt qua trong CassandraState khi cần thiết. Vấn đề với tùy chọn 2 là không phải tất cả các chức năng trong mô-đun sẽ thay đổi trạng thái. Ví dụ, có được một kết nối sẽ sửa đổi trạng thái và sẽ yêu cầu người gọi để stash off trạng thái kết quả. Tuy nhiên, việc lưu một bản ghi mới cần phải đọc trạng thái (để nhận các cuộc gọi lại), nhưng nó không cần phải thay đổi trạng thái. Tùy chọn 2 không cung cấp cho người gọi bất kỳ gợi ý nào kết nối thay đổi trạng thái trong khi tạo không.
Tuy nhiên, nếu tôi chuyển từ sử dụng đơn vị StateT và chỉ có các hàm tham gia trạng thái dưới dạng tham số và trả về giá trị đơn giản hoặc các giá trị đơn giản và trạng thái mới, thì thực sự rõ ràng đối với người gọi khi tiểu bang cần để được cứu. (Theo bao gồm trong mô-đun của tôi, tôi muốn đưa các tiểu bang đến và xây dựng chúng thành một (StateT CassandraState IO) monad, nhưng các chi tiết của điều này sẽ được ẩn từ người gọi.Vì vậy, để người gọi, giao diện là rất rõ ràng , nhưng dưới bìa, nó chỉ là Lựa chọn 2.)
Tùy chọn 4:
Cái gì khác?
Sự cố này phải xuất hiện khá thường xuyên khi xây dựng mô-đun có thể tái sử dụng. Có cách nào tiêu chuẩn để giải quyết nó không?
(Bằng cách này, nếu ai đó biết một cách tốt hơn để tương tác với Cassandra từ Haskell so với sử dụng tiết kiệm, xin vui lòng cho tôi biết! Có lẽ tôi không cần phải viết những dòng này ở tất cả. :-)
FYI - trong mô-đun vòng kết nối Haskell 'là đơn vị biên dịch, nghĩa là - một tệp nguồn duy nhất. Mặc dù tôi không thực sự có một danh từ tốt hơn cho những gì bạn đang mô tả, nói về một 'mô-đun' có nhà nước ném tôi một chút. –
Rất tiếc. Tôi nên nói 'gói' hoặc 'thư viện'. –