Ich verwende parsec, um einige Quellcode in einem AST zu analysieren. Ich habe vor kurzem die -Wall
und -W
Optionen aktiviert, um "verdächtigen" Code zu fangen, und es beschwert sich über viele der the parsec-related top-level functions in this file nicht explizite Typ Erweiterungen.Verstehen von Parsec-Typ Anmerkungen
Beispiel 1
vimL = choice [ block
, statement
]
Die abgeleitete Typ hier ist:
vimL :: ParsecT String() Data.Functor.Identity.Identity Node
Also, wenn ich diese Anmerkung hinzufügen, der Compiler beschwert sich über keinen Zugang zu Data.Functor.Identity.Identity
, was bedeutet, ich muss import
es:
import Data.Functor.Identity
Und wenn ich das tue, kann ich si mplify die Art Anmerkung an:
vimL :: ParsecT String() Identity Node
und der Compiler wird es noch akzeptieren. Aber ich verstehe es immer noch nicht sehr.
Beispiel 2
link = Link <$> (bar *> linkText <* bar)
where
bar = char '|'
linkText = many1 $ noneOf " \t\n|"
Die abgeleitete Typ hier ist:
link :: forall u.
ParsecT String u Data.Functor.Identity.Identity Node
Aber ich kann nicht verwenden, es sei denn ich auch verwenden:
{-# LANGUAGE RankNTypes #-}
Bitte beachte, dass ich verzichten kann damit, wenn ich die forall
fallen lasse. Beide dieser Arbeit:
link :: ParsecT String u Data.Functor.Identity.Identity Node
link :: ParsecT String u Identity Node
Beispiel 3
string' s = mapM_ char' s >> pure s <?> s
dieses ein abgeleiteter Typ ist:
string' :: forall s u (m :: * -> *).
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
Um diese eine zu verwenden, ich brauche beides:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE KindSignatures #-}
Aber wieder, wenn ich diefallen lassekann ich den Typ der folgenden vereinfachen und der Compiler noch akzeptiert es:
string' :: Stream s m Char => [Char] -> ParsecT s u m [Char]
nicht sehr einfach, aber. Weiter zu gehen und Fallenlassen der constaint:
string' :: [Char] -> ParsecT s u m [Char]
ich:
No instance for (Stream s m Char) arising from a use of ‘char'’
Ich dachte:
{-# LANGUAGE NoMonomorphismRestriction #-}
könnte mich daran aus, aber es funktioniert nicht.
Fragen
Diese meist über den Kopf gehen, so will ich nicht blind den abgeleiteten Typ Signaturen in, ohne vorher etwas mehr Einblick zu gewinnen Paste kopieren zu. Kann jemand etwas Licht auf das werfen, was diese, die besten Methoden zum Kommentieren des Parsec-schweren Codes bedeuten, was die forall
mich kauft, wenn es weggelassen werden kann, ohne irgendwelche Compilerfehler zu verursachen, und ob es irgendwelche aliasing Tricks gibt, die ich kann Anwenden, um diese lesbarer zu machen?
Dies ist sehr hilfreich. 'string ':: forall su (m :: * -> *). Stream sm Char => [Char] -> Parallelabschnitt Summe [Char] '' wurde String‘:: String -> Parser String', und die meisten anderen sich mit' Parser Node', 'Parser String' oder' Parser() ' . – wincent