Отчеты об ошибках парсера для получения правильных экземпляров

Я пытаюсь построить анализатор сообщений об ошибках в 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`

Тем не менее, я продолжал получать ошибку: Error2

Мне было интересно, почему он не может получить контекст get из MonadState String m, когда в моем производном предложении у меня есть MonadState String.

Ошибка для моего первоначального вопроса здесь: Error1

0 ответов

Другие вопросы по тегам