2008-10-01 19 views
20

No puedo entender este problema de sintaxis con una expresión case en un bloque do.Sintaxis Haskell para una expresión de caso en un bloque do

¿Cuál es la sintaxis correcta?

Si pudiera 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. Sólo un consejo para cualquier otra persona que comience en Haskell. Si tiene problemas, compruebe las pestañas y espacios en su código fuente.

Respuesta

25

return es una función (sobrecargada) y no espera que su primer argumento sea una palabra clave. Usted puede 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 utilizar el operador práctico de aplicación ($):

foo = do 
    args <- getArgs 
    return $ case args of 
       [] -> "No Args" 
       [s]-> "Some Args" 

stylewise, yo me partiría hacia fuera en otra función:

foo = do 
    args <- getArgs 
    return (has_args args) 

has_args [] = "No Args" 
has_args _ = "Some Args" 

pero todavía es necesario poner en paréntesis o usar ($), porque return toma un argumento y la aplicación de función es la más alta.

+0

Pensé en probar ambas opciones. Antes de enviar las preguntas. Tonto de mí. Gracias – Ted

10

De manera equivalente:

foo = do 
    args <- getArgs 
    case args of 
     [] -> return "No Args" 
     [s]-> return "Some Args" 

Es probablemente preferible hacer como wnoise sugiere, pero esto podría ayudar a alguien a entender un poco mejor.

+0

Este método hace muy bien hincapié en la naturaleza de primera clase de las acciones de E/S. – wnoise

Cuestiones relacionadas