Пример тривиального parsec создает ошибку типа

Я пытаюсь получить этот тривиальный код парсека для компиляции

import Text.Parsec
simple = letter

но я продолжаю получать эту ошибку

No instance for (Stream s0 m0 Char)
  arising from a use of `letter'
Possible fix: add an instance declaration for (Stream s0 m0 Char)
In the expression: letter
In an equation for `simple': simple = letter

Ответы

Ответ 1

Я думаю, вы столкнулись с ограничением мономорфизма. Это ограничение означает: если переменная объявлена ​​без явных аргументов, ее тип должен быть мономорфным. Это заставляет typechecker выбирать конкретный экземпляр Stream, но он не может решить.

Есть два способа борьбы с ним:

  • Дайте simple явную подпись:

    simple :: Stream s m Char => ParsecT s u m Char
    simple = letter
    
  • Отключите ограничение мономорфизма:

    {-# LANGUAGE NoMonomorphismRestriction #-}
    import Text.Parsec
    simple = letter
    

См. Что такое ограничение мономорфизма? для получения дополнительной информации о ограничении мономорфизма.