Syntaxe Haskell pour une expression de casse dans un bloc do
Question
Je n'arrive pas à comprendre ce problème de syntaxe avec une expression case
dans un bloc do
.
Quelle est la syntaxe correcte?
Si vous pouviez corriger mon exemple et l'expliquer, ce serait le meilleur.
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"
Une petite mise à jour. Mon fichier source était un mélange d'espaces et de tabulations, ce qui posait toutes sortes de problèmes. Juste un pourboire pour quelqu'un d'autre qui commence à Haskell. Si vous rencontrez des problèmes, recherchez des tabulations et des espaces dans votre code source.
La solution
return est une fonction (surchargée), et il ne s'attend pas à ce que son premier argument soit un mot clé. Vous pouvez soit mettre entre parenthèses:
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")
ou utilisez l'opérateur d'application pratique ($):
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
Stylewise, je le diviserais en une autre fonction:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
mais vous devez toujours mettre entre parenthèses ou utiliser ($), car return prend un argument et que la fonction application a la priorité la plus élevée.
Autres conseils
De manière équivalente:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
Il est probablement préférable de le faire comme le suggère wnoise, mais cela pourrait aider quelqu'un à comprendre un peu mieux.