Do sau:Trích xuất một giá trị Có lẽ trong IO
> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")
ghci mang lại cho tôi
*** Exception: user error (OOPS)
Tất nhiên, fromMaybe đang làm việc một cách chính xác:
> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"
Nhưng dường như Thao tác IO đang được thực hiện và sau đó bị hủy:
> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"
Tại sao điều này lại xảy ra? Có cách nào để làm cho IO monad lazier?
Cụ thể, được đưa ra value :: IO (Maybe a)
một (sạch, súc tích) cách để nói
result <- (liftM2 fromMaybe) err value
là những gì và có nó giải nén dẫn hoặc ném một IOError cho phù hợp?
Cảm ơn bạn đã quan tâm, nhưng đó là một chút không có cơ sở. Tôi đang ném các lỗi trong một số chức năng cấp hai mà mỗi người làm chút IO của họ để lấy một số cấu hình. Chức năng cấu hình tầng đầu tiên sẽ thử tất cả chúng với một "bắt" và định dạng bất kỳ lỗi nào một cách độc đáo. Nó cho phép tôi duy trì việc xử lý lỗi của mình ở một nơi mà không cần chỉ định một hàm "handleErr" thông qua tất cả các hàm hạng hai. Trong kịch bản như vậy, các lỗi vẫn là một ý tưởng tồi? – So8res
So8res: cá nhân tôi muốn có các hàm bậc hai tạo ra các giá trị 'Có thể', và sau đó hàm cấu hình tầng đầu tiên có thể gộp chúng lại với nhau như' sequence' hoặc '<$>' và '<*>', hoặc xử lý mỗi lỗi tiềm năng riêng biệt, như mong muốn. Đó là một vấn đề của hương vị, nhưng theo ý kiến của tôi, lỗi gần như luôn luôn là một ý tưởng tồi trong Haskell, kể từ khi chúng tôi có abstractions mạnh mẽ cho phép chúng tôi soạn 'Có lẽ'. Cơ chế lưu lượng điều khiển ném/nắm không khớp với kiểu FP mà Haskell khuyến khích. –