Domanda

Non riesco proprio a capire questo problema di sintassi con un'espressione case in un blocco do .

Qual è la sintassi corretta?

Se potessi correggere il mio esempio e spiegarlo sarebbe il migliore.

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"

Un piccolo aggiornamento. Il mio file sorgente era un mix di spazi e schede e causava ogni tipo di problema. Solo un consiglio per chiunque inizi a Haskell. Se riscontri problemi, verifica la presenza di schede e spazi nel codice sorgente.

È stato utile?

Soluzione

return è una funzione (sovraccarica) e non si aspetta che il suo primo argomento sia una parola chiave. Puoi scegliere tra parentesi:

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 utilizza il pratico operatore dell'applicazione ($):

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

Stylewise, lo dividerei in un'altra funzione:

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

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

ma devi comunque essere tra parentesi o usare ($), perché return accetta un argomento e l'applicazione della funzione ha la precedenza più alta.

Altri suggerimenti

In modo equivalente:

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

Probabilmente è preferibile fare come suggerisce la wnoise, ma questo potrebbe aiutare qualcuno a capire un po 'meglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top