Sintaxis de Haskell para una expresión de caso en un bloque do
Pregunta
No puedo resolver este problema de sintaxis con una expresión case
en un bloque do
.
¿Cuál es la sintaxis correcta?
Si pudieras corregir mi ejemplo y explicarlo, sería lo mejor.
module Main where
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return case args of
[] -> "No Args"
[s]-> "Some Args"
Una pequeña actualización. Mi archivo fuente era una mezcla de espacios y pestañas y estaba causando todo tipo de problemas. Solo una sugerencia para cualquiera que empiece en Haskell. Si tiene problemas, compruebe las pestañas y los espacios en su código fuente.
Solución
return es una función (sobrecargada), y no espera que su primer argumento sea una palabra clave. Puedes poner entre paréntesis:
module Main where
import System(getArgs)
main = do
putStrLn "This is a test"
s <- foo
putStrLn s
foo = do
args <- getArgs
return (case args of
[] -> "No Args"
[s]-> "Some Args")
o utilice el operador de la aplicación ($):
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
Stylewise, lo dividiría en otra función:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
pero aún necesita paréntesis o usar ($), porque la devolución toma un argumento, y la aplicación de función es la prioridad más alta.
Otros consejos
Equivalentemente:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
Probablemente sea preferible hacer lo que sugiere Wnoise, pero esto podría ayudar a alguien a entender un poco mejor.