2011-07-17 7 views
16

Estoy tratando de obtener este código parsec trivial para compilarejemplo parsec Trivial produce un error de tipo

import Text.Parsec 
simple = letter 

pero me siguen dando este error

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 
+0

No estoy de acuerdo en que sea un duplicado. Sí, se refieren al mismo problema básico, pero esa pregunta es general, donde esta es específica. Alguien que busca esta instancia específica del problema no necesita conocer todos los detalles de la restricción, solo necesita recomendaciones específicas de cómo resolver el problema, particularmente, necesita saber cuál es la firma de tipo correcta para tal problema. la función sería. – Jules

Respuesta

19

yo creo que hay corrió en contra de la restricción de monomorfismo. Esta restricción significa: si una variable se declara sin argumentos explícitos, su tipo tiene que ser monomórfico. Esto obliga al contador de tipos a elegir una instancia particular de Stream, pero no puede decidir.

Hay dos maneras de luchar contra ella:

  1. Dale simple una firma explícita:

    simple :: Stream s m Char => ParsecT s u m Char 
    simple = letter 
    
  2. desactiva la restricción monorphism:

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

Ver What is the monomorphism restriction? para obtener más información sobre la restricción de monomorfismo.

+0

Oh, normalmente se obtiene un error que dice "no se puede hacer esto debido a la restricción de monomorfismo" cuando esto sucede. – Peter

+1

No sé por qué es así. Puede estar relacionado con el nuevo motor de inferencia de tipo en GHC 7. – fuz

Cuestiones relacionadas