Hata işlemeyi de destekleyebilen bir durum monad yazmalıyım. Bu amaçla E monad'ı kullanmayı düşünüyordum çünkü hataya neden olan şey hakkında ayrıntılar da sağlayabilir. Ben bir durum monad için Belki monad kullanarak bir tanım buldum, ancak Ben, yerine Belki kullanmak için değiştiremiyorum. İşte kod:Hata işleme de yapan bir durum monadını nasıl yazabilirim?
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}
İlk kod bloğu ile ikinci arasındaki farkı göremiyorum. Yanlışlıkla aynı kodu iki kez dahil ettiniz mi, yoksa değilse, farkı açıklayabilir misiniz? – seh
@seh, iyi yakalama, güncellendi –
Ayrıca, bu ikisinin operasyonel olarak biraz farklı olduğunu unutmayın. İkinci sürüm, devam edilebilir hatalara izin verirken, ilk sürüm ilk hatada sonlanır. Günlüğe kaydetme modelleme yapıyorsanız, ilk sürümün de oturum açma hatası olduğunu "kaybeder". –