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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top