es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado:

    1. El tipo de dato BigNumber no está definido correctamente. Debería tener dos argumentos: un Char para el signo y una lista de Integer para los dígitos. La sintaxis correcta para definir el tipo de dato BigNumber es:
      data BigNumber = BigNumber Char [Integer]
      
    2. En la función scanner, s y n no están definidos. Debes definir s como el primer carácter de la cadena de entrada (el signo) y n como el resto de la cadena de entrada (los dígitos). Luego puedes usar scanner_Sign y scanner_Numbers para construir el BigNumber. La sintaxis correcta para definir la función scanner es:
      scanner :: String -> BigNumber
      scanner str = let s = head str
                       n = tail str
                   in BigNumber (scanner_Sign s) (scanner_Numbers (s, n))
      
    3. En la función output, el patrón de coincidencia es incorrecto. El constructor BigNumber no debería estar incluido en la cláusula where. Puedes hacer coincidir el argumento BigNumber directamente. La instrucción if 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ón intercalate del módulo Data.List. La sintaxis correcta para definir la función output es:
      import Data.List (intercalate)
      
      output :: BigNumber -> String
      output (BigNumber sign numbers) =
         let signStr = if sign == '+' then "" else "-"
             numbersStr = intercalate "" $ map show numbers
         in signStr ++ numbersStr
      

Comments are closed.