He estado jugando con Haskell durante aproximadamente un mes. Para mi primer proyecto Haskell "real" estoy escribiendo un etiquetador de partes de discurso. Como parte de este proyecto que tengo un tipo llamado Tag
que representa una etiqueta de partes de discurso, implementado de la siguiente manera:
data Tag = CC | CD | DT | EX | FW | IN | JJ | JJR | JJS ...
Lo anterior es una larga lista de etiquetas estandarizadas partes-de-discurso que he intencionalmente truncado. Sin embargo, en este conjunto estándar de etiquetas, hay dos que terminan en un signo de dólar ($): PRP $ y NNP $. Como no puedo tener constructores de tipo con $ en su nombre, he decidido cambiarles el nombre de PRPS y NNPS.
Esto está muy bien, pero me gustaría leer las etiquetas de las cadenas en un léxico y convertirlas a mi tipo Tag
. Probar esto falla:
instance Read Tag where
readsPrec _ input =
(\inp -> [((NNPS), rest) | ("NNP$", rest) <- lex inp]) input
El Haskell lexer se ahoga en el $. Alguna idea de cómo sacar esto?
Implementing Show fue bastante sencillo. Sería genial si hubiera alguna estrategia similar para Read.
instance Show Tag where
showsPrec _ NNPS = showString "NNP$"
showsPrec _ PRPS = showString "PRP$"
showsPrec _ tag = shows tag
Casi la única vez que debería escribir sus propias instancias 'Show' y' Read', en lugar de usar las instancias derivadas automáticamente, es si su tipo de datos oculta su representación interna (como 'Data.Set.Set 'y tal, que escupió una llamada' fromList') o funciona con literales, por ejemplo una instancia de 'Num' escupiendo un literal entero al que corresponde. –