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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top