Подтвердить что ты не робот

Какая разница между Text.ParserCombinators.Parsec и Text.Parsec

Text
    Text.Parsec
        Text.Parsec.ByteString
            Text.Parsec.ByteString.Lazy
        Text.Parsec.Char
        Text.Parsec.Combinator
        Text.Parsec.Error
        Text.Parsec.Expr
        Text.Parsec.Language
        Text.Parsec.Perm
        Text.Parsec.Pos
        Text.Parsec.Prim
        Text.Parsec.String
        Text.Parsec.Token
    ParserCombinators
        Text.ParserCombinators.Parsec
            Text.ParserCombinators.Parsec.Char
            Text.ParserCombinators.Parsec.Combinator
            Text.ParserCombinators.Parsec.Error
            Text.ParserCombinators.Parsec.Expr
            Text.ParserCombinators.Parsec.Language
            Text.ParserCombinators.Parsec.Perm
            Text.ParserCombinators.Parsec.Pos
            Text.ParserCombinators.Parsec.Prim
            Text.ParserCombinators.Parsec.Token

Являются ли они одинаковыми?

4b9b3361

Ответ 1

В настоящее время существуют две широко используемые основные версии Parsec, Parsec 2 и Parsec 3.

Мой совет - просто использовать последнюю версию Parsec 3. Но если вы хотите сделать сознательный выбор, читать дальше.

Новое в Parsec 3

Monad Transformer

Parsec 3 вводит монадный трансформатор ParsecT, который может использоваться для объединения синтаксический анализ с другими монадическими эффектами.

Струйные

Хотя Parsec 2 позволяет вам выбрать тип токена (что полезно, когда вы хотите отделить лексический анализ от синтаксического анализа), токены всегда упорядоченных в списки. Список может быть не самой эффективной структурой данных для хранения большие тексты.

Parsec 3 может работать с произвольными потоками - структуры данных со списком интерфейс. Вы можете определить свои собственные потоки, но Parsec 3 также включает популярные и эффективная реализация Stream на основе ByteString (для Char -based синтаксический анализ), отображаемый через модули Text.Parsec.ByteString и Text.Parsec.ByteString.Lazy.

Причины предпочтения Parsec 2

Меньше требуемых расширений

Дополнительные функции, предоставляемые Parsec 3, не предоставляются бесплатно: реализовать их требуется несколько языковых расширений.

Ни одна из двух версий не является Haskell-2010 (т.е. оба используют расширения), но Parsec 2 использует меньше расширений, чем Parsec 3, поэтому вероятность того, что любой данный компилятор могут компилировать Parsec 2 выше, чем для Parsec 3.

К этому времени обе версии работают с GHC, в то время как Parsec 2 также сообщил, чтобы строить с JHC и входит в состав одной из стандартных библиотек JHC.

Производительность

Первоначально (то есть в версии 3.0) Parsec 3 был значительно медленнее, чем Parsec 2. Однако работа над улучшением производительности Parsec 3 была выполнена, и с версии 3.1 Parsec 3 только немного медленнее, чем Parsec 2 (контрольные показатели: 1, 2).

Уровень совместимости

Было возможно "переопределить" все API Parsec 2 в Parsec 3. Это уровень совместимости обеспечивается пакетом Parsec 3 под иерархией модулей Text.ParserCombinators.Parsec (та же иерархия, которая используется Parsec 2), в то время как новый API Parsec 3 доступен в иерархии Text.Parsec.

Это означает, что вы можете использовать Parsec 3 в качестве замены для Parsec 2.

Ответ 2

Я считаю, что последний является обратным совместимым уровнем для Parsec 2, реализованным в терминах более нового API.