Tôi cần phải viết một đơn vị trạng thái cũng có thể hỗ trợ xử lý lỗi. Tôi đã nghĩ đến việc sử dụng một trong hai đơn nguyên cho mục đích này bởi vì nó cũng có thể cung cấp chi tiết về những gì gây ra lỗi. Tôi tìm thấy một định nghĩa cho một nhà nước monad sử dụng Có lẽ monad tuy nhiên tôi không thể sửa đổi nó để sử dụng Hoặc, thay vì Có thể. Đây là mã:Tôi có thể viết một đơn vị trạng thái xử lý lỗi như thế nào?
newtype StateMonad a = StateMonad (State -> Maybe (a, State))
instance Monad StateMonad where
(StateMonad p) >>= k = StateMonad (\s0 -> case p s0 of
Just (val, s1) -> let (StateMonad q) = k val in q s1
Nothing -> Nothing)
return a = StateMonad (\s -> Just (a,s))
data State = State
{ log :: String
, a :: Int}
Tôi không thấy sự khác biệt giữa khối mã đầu tiên và khối thứ hai. Bạn đã nhầm lẫn bao gồm cùng một mã hai lần hay không, nếu không, bạn có thể làm rõ sự khác biệt không? – seh
@seh, bắt tốt, nó được cập nhật –
Cũng lưu ý rằng hai thao tác này có một chút khác biệt. Phiên bản thứ hai cho phép các lỗi có thể tiếp tục, trong khi phiên bản đầu tiên chấm dứt vào lỗi đầu tiên. Nếu bạn đang lập mô hình ghi nhật ký, hãy lưu ý rằng phiên bản đầu tiên cũng 'mất' nhật ký do lỗi. –