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 RPS
o 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.