2012-05-04 46 views
5

Tôi muốn viết một hàm saveStuff để lưu nội dung nào đó vào một tệp, sau khi vượt qua một số thử nghiệm nhất định. Nếu kiểm tra thất bại, tôi cần phải báo lỗi. Loại kết quả của chức năng này là gì? Tôi đã nghĩ đến IO (Either String())IO (Maybe String), nhưng cả hai người trong số họ đều cảm thấy sai vì một số lý do. Tôi đã tra cứu các hàm tương tự từ thư viện chuẩn, nhưng chúng dường như chỉ trả lại IO(). Họ ném ngoại lệ về thất bại. Tôi không thể thấy mình thích cách tiếp cận đó.Loại kết quả của chức năng này là gì?

+7

Nếu nó có thể thành công chỉ bằng một cách, 'Có thể ErrorMessage' hoặc một cái gì đó isomorphic là loại chính xác. Nếu bạn không thích 'Có thể' bởi vì thường' Nothing' chỉ ra thất bại, hãy sử dụng 'data Result = Success | Chuỗi lỗi'. –

+2

@DanielFischer: Đó có lẽ là một câu trả lời (chứ không phải là một bình luận). –

Trả lời

7

Bạn có thể xem xét viết cái gì mà trả về một ErrorT String IO(). Tài liệu cho máy biến áp đơn lẻ ErrorTon Hackage. Có nhiều đề xuất trong số tuyệt vời Eight Ways to Report Errors bởi Eric Kidd và follow up một số năm sau đó bởi Edward Yang.

+0

'LỗiT' là những gì tôi nghĩ đến, quá. Bạn có bản chất là một 'IO()', và bạn muốn thêm tiềm năng cho một lỗi với một thông điệp, vì vậy chỉ cần tát biến 'ErrorT' ở trên nó. –

6

Nếu chỉ có một cách saveStuff có thể thành công, một loại đẳng cấu là Maybe ErrorMessage là loại chính xác. Maybe ErrorMessage chính nó có nhược điểm thường là Nothing biểu thị sự thất bại khi sử dụng Maybe, vì vậy nó sẽ chạy ngược với mong đợi ở đây. Liên quan đến điều đó, Either ErrorMessage() là tốt hơn, nhưng tham số () đến trường hợp Right không mang bất kỳ thông tin nào, do đó tùy chọn đó cũng thiếu sự thanh lịch.

Nếu bạn không muốn chấp nhận những thiếu sót, xác định kết quả của bạn loại riêng

data Result = Success | Failure ErrorMessage 
-- with type ErrorMessage = String, for example 
Các vấn đề liên quan