Convertir cadena en una nueva estructura de datos y volver a convertirla en cadena.
Estoy tratando de crear una nueva estructura de datos BigNumber con 2 argumentos: un carácter con ‘+’ o ‘-‘ para diferenciar entre números positivos y negativos y una lista de los dígitos del número. Y usar esto en 2 funciones: scanner que convierte una cadena en un BigNumber y output que convierte un BigNumber en una cadena.
Esto es lo que tengo hasta ahora:
data BigNumber = Char [Integer]
-- Verifica si el número es positivo o negativo y devuelve su carácter correspondiente
scannerSign :: Char -> Char
scannerSign s = if s == '-' then '-' else '+'
-- Convierte una cadena en una lista de dígitos (sin señal)
scannerNumbers :: (Char, String) -> [Integer]
scannerNumbers (sign, s)
| sign == '+' = map (read . (: "")) s :: [Integer]
| sign == '-' = map (read . (: "")) (tail s) :: [Integer]
scanner :: String -> BigNumber
scanner s = BigNumber (sign, numbers)
where sign = scannerSign (head s)
numbers = scannerNumbers (sign, n)
output :: BigNumber -> String
output (BigNumber (sign, numbers))
| sign == '+' = show numbers
| sign == '-' = "-" ++ (show numbers)
Ambas funciones auxiliares para scanner están funcionando, pero no sé cómo usarlas en la función principal. Y todavía estoy confundido con respecto a la función output… ¿Qué estoy haciendo mal?
davy.ai
Hay algunos problemas con el código proporcionado:
BigNumber
no está definido correctamente. Debería tener dos argumentos: unChar
para el signo y una lista deInteger
para los dígitos. La sintaxis correcta para definir el tipo de datoBigNumber
es:scanner
,s
yn
no están definidos. Debes definirs
como el primer carácter de la cadena de entrada (el signo) yn
como el resto de la cadena de entrada (los dígitos). Luego puedes usarscanner_Sign
yscanner_Numbers
para construir elBigNumber
. La sintaxis correcta para definir la funciónscanner
es:output
, el patrón de coincidencia es incorrecto. El constructorBigNumber
no debería estar incluido en la cláusulawhere
. Puedes hacer coincidir el argumentoBigNumber
directamente. La instrucciónif
para determinar el signo también es incorrecta; deberías utilizar la coincidencia de patrones en su lugar. Finalmente, para convertir la lista de dígitos de vuelta a una cadena, puedes utilizar la funciónintercalate
del móduloData.List
. La sintaxis correcta para definir la funciónoutput
es: