Saltar al contenido

Haskell: ¿cómo verifica los tipos de tiempo de ejecución en IO?

Te damos el resultado a esta pregunta, al menos eso esperamos. Si presentas inquietudes dínoslo, que sin dudarlo te responderemos

Solución:

No transformaste el choice (el cual es un String) a una RPSo mejor aún un Maybe RPS:

readRPS :: String -> Maybe RPS
readRPS "rock" = Just Rock
readRPS "paper" = Just Paper
readRPS "scissors" = Just Scissors
readRPS _ = Nothing

Aquí devolvemos así un Just x dado que la entrada es válida (con x el correspondiente RPS elemento), o Nothing Si el string no es una opción válida.

Entonces podemos implementar esto como:

import Data.Char(toLower)

main :: IO ()
main = do
    putStrLn "Rock, Paper, or Scissors?"
    choice <- getLine
    case readRPS (map toLower choice) of
        Just rps -> putStrLn (_shoot rps Rock) 
        Nothing -> putStrLn "Invalid choice."
    main

Ya casi llega, solo necesita la función de lectura para convertir el usuario string para usted RPS tipo de datos.

Lo primero que tienes que hacer es hacer RPS una instancia de la Read clase de tipo. Esto se puede hacer fácilmente modificando su data declaración a:

data RPS = Rock | Paper | Scissors deriving Read

qué deriving Read hace es dar RPS una instancia predeterminada del Read typeclass, que funciona de la manera obvia: read "Rock" se convertirá Rock y así sucesivamente, siempre que el compilador sepa que está usando read en un contexto donde un valor de tipo RPS se espera.

Entonces todo lo que necesita hacer, en su main función, es cambiar esto:

putStrLn (_shoot choice Rock)

a

putStrLn (_shoot (read choice) Rock)

Ya que _shoot tiene una firma de tipo que le dice a GHC que su primer argumento debe ser un RPS valor, sabrá utilizar la instancia de read definido para su RPS escriba, y todo debería estar bien, ya que ha restringido las opciones de usuario válidas a esas 3 cadenas específicas.

(Tenga en cuenta que para programas más grandes hay formas más seguras y mejores de manejar cosas como esta; consulte la respuesta de Willem para un enfoque simple, pero esto está bien para un ejercicio de aprendizaje básico).

Valoraciones y reseñas

Puedes añadir valor a nuestra información aportando tu veteranía en las crónicas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *