Я пытаюсь разделить монаду IResult
от attoparsec на несколько частей. Здесь IResult
data IResult t r = Fail t [String] String
| Partial (t -> IResult t r)
| Done t r
Похоже, что это должно быть сочетание эффектов, "пристрастности" и неудачи. Если отказ представлен как просто Either ([String], String)
, то пристрастность может быть
data Partiality t a = Now a | Later (t -> Partiality t a)
instance Monad (Partiality t) where
return = pure
(Now a) >>= f = f a
(Later go) >>= f = Later $ \t -> go t >>= f
class MonadPartial t m where
feed :: t -> m a -> m a
final :: m a -> Bool
instance MonadPartial t (Partiality t) where
feed _ (Now a) = Now a
feed t (Later go) = go t
final (Now _) = True
final (Later _) = False
(который получает тезку от статью Даниэльссона, когда вы используете Partiality ()
)
Я мог бы использовать Partiality
в качестве базовой монады, но есть ли монадный трансформатор PartialityT
?