Frage

Ich kann nicht ganz diese Syntax Problem mit einem case Ausdruck in einem do Block herauszufinden.

Was ist die korrekte Syntax?

Wenn Sie mein Beispiel korrigieren können und erklären, dass die am besten wäre.

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"

Ein kleines Update. Meine Quelldatei war eine Mischung aus Leerzeichen und Tabulatoren und es verursacht wurde alle Arten von Problemen. Nur ein Tipp für irgendein anderes in Haskell zu starten. Wenn Sie Probleme für Tabs und Leerzeichen in Ihrem Quellcode überprüfen.

War es hilfreich?

Lösung

Rückkehr ist eine (überladene) Funktion, und es ist nicht ihr erstes Argument erwartet ein Schlüsselwort zu sein. Sie können entweder parenthesize:

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")

oder verwenden Sie die praktische Anwendung Operator ($):

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

Stilistisch würde ich es brechen in eine andere Funktion:

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

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

aber Sie müssen noch klammern oder verwenden ($), weil Rückkehr ein Argument, und Funktionsanwendung ist die höchste Priorität.

Andere Tipps

Gleichwertig:

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

Es ist wahrscheinlich vorzuziehen, zu tun, wie wnoise schlägt vor, aber dies könnte jemand helfen, ein bisschen besser zu verstehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top