attoparsecIResult
からモナドをいくつかの断片に分解しようとしています。こちらです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
( を使用すると、Danielsson の論文からその名前が付けられますPartiality ()
)
Partiality
ベースモナドとして使えますが、PartialityT
モナドトランスフォーマーはありますか?