我不知道如何Applicative
为这个解析器实现一个实例:
newtype Parser m s a = Parser { getParser :: [s] -> m ([s], a) }
不假设Monad m
。我预计只需要假设Applicative m
,因为Functor
实例只需要假设Functor m
。我终于结束了:
instance Functor m => Functor (Parser m s) where
fmap f (Parser g) = Parser (fmap (fmap f) . g)
instance Monad m => Applicative (Parser m s) where
pure a = Parser (\xs -> pure (xs, a))
Parser f <*> Parser x = Parser h
where
h xs = f xs >>= \(ys, f') ->
x ys >>= \(zs, x') ->
pure (zs, f' x')
我该怎么做呢?我尝试手动替换>>=
,但总是在试图减少 a 时陷入困境join
——这也需要Monad
.
我也咨询了Parsec,但即使这样也没有多大帮助:
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap
我问这个问题的原因纯粹是为了自学。