Sono in procinto di guardare il Fondamenti di programmazione funzionale serie di conferenze di Erik Meijer (con diapositive di Graham Hutton).Perché sto ottenendo un errore di tipo in questa sequenza di parser (lezione 8 di Erik Meijer)?
In lecture 8 (on functional parsers), dopo aver definito il tipo Parser a
, introducendo alcune primitive di analisi (tra cui item
e return
, che ho chiamato return'
), Erik dà un simple example di come i suoi parser possono essere combinati in una sequenza, utilizzando la sintassi fare:
type Parser a = String -> [(a,String)]
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
return' :: a -> Parser a
return' v = \inp -> [(v,inp)]
p :: Parser (Char,Char)
p = do x <- item
item
y <- item
return' (x,y)
Tuttavia, quando provo a caricare questo GHCi, ottengo il seguente errore di tipo, che non mi aspettavo e non capisco:
Couldn't match type ‘[(Char, String)]’ with ‘Char’
Expected type: String -> [((Char, Char), String)]
Actual type: Parser ([(Char, String)], [(Char, String)])
In a stmt of a 'do' block: return' (x, y)
In the expression:
do { x <- item;
item;
y <- item;
return' (x, y) }
Failed, modules loaded: none.
Cosa sto sbagliando?
Non so la risposta, ma credo che queste lezioni vadano insieme al modulo chiamato Text.ParserCombinators.HuttonMeijer. Dopo averlo installato, sono stato in grado di andare come nelle lezioni, ad eccezione di digitare papply anziché analisi: ///// Preludio>: m Text.ParserCombinators.HuttonMeijer ///// Prelude Text.ParserCombinators.HuttonMeijer> /////Prelude Text.ParserCombinators.HuttonMeijer> item papply "abc" ///// [('a', "bc")] – Elliot