2011-07-17 11 views
16

próbuję uzyskać ten trywialny kod parsec skompilowaćTrivial parsec przykład wywołuje błąd typu

import Text.Parsec 
simple = letter 

ale wciąż otrzymuję ten błąd

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

Nie zgadzam się z tym, że jest to duplikat. Tak, dotyczą one tej samej podstawowej kwestii, ale to pytanie jest ogólne, gdzie jest ono konkretne. Ktoś, kto szuka tej konkretnej instancji problemu, nie musi znać wszystkich szczegółów tego ograniczenia, po prostu potrzebuje konkretnych zaleceń, jak rozwiązać problem - w szczególności, musi wiedzieć, jaki podpis poprawny dla takiego typu funkcja będzie. – Jules

Odpowiedz

19

myślę, że masz prowadził przeciwko ograniczenie monomorfizmu. To ograniczenie oznacza: Jeśli zmienna jest zadeklarowana bez jawnych argumentów, jej typ musi być monomorficzny. Zmusza to typechecker do wybrania konkretnej instancji Stream, ale nie może zdecydować.

Istnieją dwa sposoby, aby to Fight:

  1. Daj simple wyraźny podpis:

    simple :: Stream s m Char => ParsecT s u m Char 
    simple = letter 
    
  2. wyłączyć ograniczenie monorphism:

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

Zobacz What is the monomorphism restriction?, aby uzyskać więcej informacji na temat ograniczenia monomorfizmu.

+0

Och, zwykle pojawia się komunikat "nie możesz tego zrobić ze względu na ograniczenie monomorfizmu", gdy tak się dzieje. – Peter

+1

Nie wiem, dlaczego tak jest. Może być powiązany z silnikiem inferencyjnym nowego typu w GHC 7. – fuz