restricciones - Sintaxis Haskell para una expresión de caso en un bloque do
restricciones multiples haskell (2)
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 entenderlo un poco mejor.
No puedo entender este problema de sintaxis con una expresión de case
en un bloque do
.
¿Cual 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 de origen era una combinación de espacios y pestañas y estaba causando todo tipo de problemas. Solo un consejo para cualquier otra persona que comience en Haskell. Si tiene problemas, compruebe las pestañas y espacios en su código fuente.
return es una función (sobrecargada) y no espera que su primer argumento sea una palabra clave. Puede 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 use el práctico operador de aplicaciones ($):
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 poner en paréntesis o usar ($), porque return toma un argumento y la aplicación de función tiene la precedencia más alta.