Estoy en el capítulo 8 de la programación de Graham Hutton en Haskell y estoy copiando el código y probándolo en GHC.Error de "programación en Haskell" en la función de sat
Ver las diapositivas aquí: http://www.cis.syr.edu/~sueo/cis352/chapter8.pdf en particular diapositiva 15
El código relevante He copiado hasta ahora es:
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
me han cambiado el nombre de la función return
del libro para pih_return
para que no entre en conflicto con la función Prelude return
.
Los errores están en la última función sat
. He copiado esto directamente del libro.
Como podrán ver p
es una función Char
-Bool
(por ejemplo isDigit
) y x
es de tipo [(Char, String)]
, así que ese es el primer error.
Entonces pih_return
toma un valor v
y devuelve [(v, inp)]
donde inp
es una String
. Esto causa un error en sat
porque el v
que se está pasando es x
que no es un Char
.
he llegado con esta solución, al incluir explícitamente en inp
sat
Es esta la mejor manera de resolver el problema?
La diapositiva 11 en esa cubierta apunta a la versión completa de la biblioteca, a la que @ Rüdiger Hanke, a continuación, le ha dado el enlace. De hecho, la plataforma de diapositivas no deja en claro que todo el código anterior a la diapositiva 11 es solo una primera versión, y todo el código después de la diapositiva 11 está destinado a ser utilizado con la versión Monadic en el archivo de la biblioteca. – MtnViewMark
Ah. Gracias, MntViewMark. Eso explica las cosas. Tampoco se menciona adecuadamente en el libro, solo en los comentarios al final del capítulo donde dice: "Por razones técnicas relacionadas con la naturaleza monádica de los analizadores sintácticos, varias de las definiciones básicas en [la] biblioteca son ligeramente diferentes a las dado aquí ". –