Отчеты об ошибках парсера для получения правильных экземпляров
Я пытаюсь построить анализатор сообщений об ошибках в haskell. В настоящее время я смотрю на учебник, и это то, что я до сих пор.
type Position = (Int, Int)
type Err = (String, Position)
newtype Parser1 a = Parser1 {parse1 :: StateT String (StateT Position (MaybeT
(Either Err))) a} deriving (Monad, MonadState String, Applicative, Functor)
runParser :: Parser1 a -> String -> Either Err (Maybe ((a, String), Position))
runParser p ts = runMaybeT $ runStateT (runStateT (parse1 p) ts) (0, 0)
basicItem = Parser1 $ do
state <- get
case state of
(x:xs) -> do {put xs; return x}
[] -> empty
item = Parser1 $ do
c <- basicItem
pos <- lift get
lift (put (f pos))
return c
f :: Char -> Position -> Position
f d (ln, c) = (ln + 1, 0)
f _ (ln, c) = (ln , c + 1)
Этот фрагмент кода не компилируется, я думаю, что это связано с моим парсером элементов и с тем фактом, что я пытаюсь получить доступ к внутреннему состоянию, а именно к позиции. Мне было интересно, как в предложении создания я могу заставить Haskell получать экземпляры для обоих состояний в моем типе синтаксического анализатора, чтобы я мог получить доступ к внутреннему состоянию?
Изменить 1:
Сначала я попытался объявить basicItem как:
basicItem :: (MonadState String m, Alternative m) => m t
basicItem = do
state <- get
case state of
(x:xs) -> do {put xs; return x}
[] -> empty`
Тем не менее, я продолжал получать ошибку:
Мне было интересно, почему он не может получить контекст get из MonadState String m, когда в моем производном предложении у меня есть MonadState String.