Sono nel capitolo 8 della Programmazione di Graham Hutton in Haskell e sto copiando il codice e lo collaudo in GHC.Errore "Programmazione in Haskell" nella funzione sat
vedere le diapositive qui: http://www.cis.syr.edu/~sueo/cis352/chapter8.pdf in particolare slitta 15
Il codice in questione Ho copiato finora è:
type Parser a = String -> [(a, String)]
pih_return :: a -> Parser a
pih_return v = \inp -> [(v, inp)]
failure :: Parser a
failure = \inp -> []
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
parse :: Parser a -> String -> [(a, String)]
parse p inp = p inp
sat :: (Char -> Bool) -> Parser Char
sat p = do x <- item
if p x then pih_return x else failure
ho cambiato il nome della funzione return
dal libro al pih_return
in modo che non sia in conflitto con la funzione Prelude return
.
Gli errori si trovano nell'ultima funzione sat
. L'ho copiato direttamente dal libro.
Come si può probabilmente vedere p
è una funzione Char
-Bool
(ad esempio isDigit
) e x
è di tipo [(Char, String)]
, quindi questo è il primo errore.
Poi pih_return
assume un valore v
e restituisce [(v, inp)]
dove inp
è un String
. Ciò causa un errore in sat
perché lo v
passato è x
che non è un Char
.
sono venuto su con questa soluzione, includendo esplicitamente inp
in sat
E 'questo il modo migliore per risolvere il problema?
La diapositiva 11 in quel mazzo punta alla versione completa della libreria, a cui @ Rüdiger Hanke ha fornito il collegamento. In effetti, la diapositiva non chiarisce che tutto il codice prima della diapositiva 11 è solo una prima versione, e tutto il codice dopo la diapositiva 11 è pensato per essere usato con la versione Monadic nel file della libreria. – MtnViewMark
Ah. Grazie, MntViewMark. Questo spiega le cose. Non è nemmeno menzionato nel libro, solo nelle osservazioni alla fine del capitolo in cui dice: "Per ragioni tecniche relative alla natura monadica dei parser, alcune delle definizioni di base nella libreria [] sono leggermente diverse da quelle dato qui ". –