file - opciones - imprimir en haskell
Cómo analizar un Tuple(String, Int) en Haskell usando parsec (1)
Creo que ya logré analizar cadenas para cadenas y cadenas a Ints, pero también necesito analizar un tipo (String, Int) como userRatings para poder leer correctamente un archivo de texto y estoy usando Parsec
Este es el análisis junto con la importación
import Text.Parsec
( Parsec, ParseError, parse -- Types and parser
, between, noneOf, sepBy, many1 -- Combinators
, char, spaces, digit, newline -- Simple parsers
)
-- Parse a string to a string
stringLit :: Parsec String u String
stringLit = between (char ''"'') (char ''"'') $ many1 $ noneOf "/"/n"
-- Parse a string to a list of strings
listOfStrings :: Parsec String u [String]
listOfStrings = stringLit `sepBy` (char '','' >> spaces)
-- Parse a string to an int
intLit :: Parsec String u Int
intLit = fmap read $ many1 digit
-- Or `read <$> many1 digit` with Control.Applicative
film :: Parsec String u Film
film = do
-- alternatively `title <- stringLit <* newline` with Control.Applicative
title <- stringLit
newline
director <- stringLit
newline
year <- intLit
newline
userRatings <- listOfStrings
newline
return (title, director, year, userRatings)
Puede hacerlo componiendo a partir de analizadores existentes utilizando la interfaz Applicative
o Monad
. Parser
tiene instancias de ambos.
Usando Applicative
:
stringIntTuple :: Parser (String, Int)
stringIntTuple = (,) <$> yourStringParser <*> yourIntParser
Que es lo mismo que el siguiente:
stringIntTuple :: Parser (String, Int)
stringIntTuple = liftA2 (,) yourStringParser yourIntParser
Usando Monad
:
stringIntTuple :: Parser (String, Int)
stringIntTuple =
do
theString <- yourStringParser
theInt <- yourIntParser
return (theString, theInt)