Sintassi di Haskell per un'espressione case in un blocco do
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.
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.