Haskell Syntax für einen Fall Expression in einem Versperren
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.
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.