Trivial parsec示例产生类型错误

Pet*_*ter 16 haskell parsec

我正在尝试将这个简单的parsec代码编译

import Text.Parsec
simple = letter
Run Code Online (Sandbox Code Playgroud)

但我一直收到这个错误

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
Run Code Online (Sandbox Code Playgroud)

fuz*_*fuz 19

我认为你已经违背了单态限制.此限制意味着:如果声明的变量没有显式参数,则其类型必须是单态的.这迫使类型检查器选择一个特定的实例Stream,但它无法决定.

有两种方法可以对抗它:

  1. 给出simple明确的签名:

    simple :: Stream s m Char => ParsecT s u m Char
    simple = letter
    
    Run Code Online (Sandbox Code Playgroud)
  2. 禁用单性限制:

    {-# LANGUAGE NoMonomorphismRestriction #-}
    import Text.Parsec
    simple = letter
    
    Run Code Online (Sandbox Code Playgroud)

请参阅什么是单态限制?有关单形态限制的更多信息.