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')
どうすればいいですか?for を手で代用しよう>>=
としましたが、 a -- を減らそうとしていつも行き詰まりました。join
これには も必要ですMonad
。
Parsecにも相談しましたが、それでもあまり役に立ちませんでした。
instance Applicative.Applicative (ParsecT s u m) where
pure = return
(<*>) = ap
この質問をする理由は、純粋に独学です。