Size: a a a

2020 November 28

IK

Ilya Kos in Haskell
:(
источник

Y

Yuuri in Haskell
У меня есть парсер (на мегапарсеке) некоторых штук, построчно считываемых из файла. В парсере нужно определять тип токена по словарю, причём половина этого словаря захардкожена, а другая перед этим загружается из другого файла. Как её пробросить в парсер? Засунуть в ParsecT Reader TypeMap? Как гарантировать, чтобы словарь создавался только один раз?
источник

к

кана in Haskell
или
ReaderT TypeMap Parsec

тут вроде без разницы

создаваться он будет один раз, потому что это будет явное создание при пробросе в runReaderT
источник

Y

Yuuri in Haskell
> ReaderT TypeMap Parsec
Так все парсерные штуки лифтить придётся
источник

к

кана in Haskell
не придется
источник

к

кана in Haskell
в мегапарсере почти все парсерные штуки над MonadParser
источник

Y

Yuuri in Haskell
Ну у меня первая попытка такой была, компилятор ругался
источник

Y

Yuuri in Haskell
Сейчас ещё раз попробую
источник

к

кана in Haskell
если инстанса нет, можно написать

instance MonadParsec e s m => MonadParsec e s (ReaderT env m) where
 -- и тут все лифтануть
источник

к

кана in Haskell
но а можно конечно и ParsecT e s (ReaderT env), такой инстанс точно есть
источник

к

кана in Haskell
но инстанс такой точно есть
источник

Y

Yuuri in Haskell
Couldn't match type ‘ParsecT Void Text Identity’
                with ‘ReaderT TypeMap Parser’
источник

к

кана in Haskell
у тебя наверное указан конкретный тип ParsecT во всех парсерах
источник

Y

Yuuri in Haskell
Да
источник

к

кана in Haskell
в туторе сказано так не делать)
источник

к

кана in Haskell
так что

newtype Parser a = Parser (ReaderT TypeMap (Parsec Void Text) a)
 deriving newtype (Functor, Applicative, Alternative, Monad)
 deriving newtype (MonadParser Void Text, MonadReader TypeMap)

f :: TypeMap -> Char

x :: Parser Char
x = do
 x <- ask
 char x
источник

к

кана in Haskell
будет работать прекрасно
источник

Y

Yuuri in Haskell
кана
в туторе сказано так не делать)
Где? Вроде наоборот:
> Speaking of type synonyms, the best way to start writing parser with megaparsec is to define a custom type synonym for your parser. This is a good idea for two reasons:
источник

к

кана in Haskell
а где наоборот
источник

к

кана in Haskell
he best way to start writing parser with megaparsec is to define a custom type synonym
источник