sintaxis restricciones pattern opciones multiples hacer funciones ejemplos declaracion data como basica haskell syntax monads

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.