2008-10-01 11 views
20

Nie mogę w pełni zrozumieć tego problemu składniowego z wyrażeniem case w bloku do.Składnia Haskella dla wyrażenia case w bloku do

Jaka jest prawidłowa składnia?

Jeśli mógłbyś poprawić mój przykład i wyjaśnić, że byłby najlepszy.

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" 

Trochę aktualizacji. Mój plik źródłowy był mieszanką spacji i tabulacji i powodował wszelkiego rodzaju problemy. Tylko wskazówka dla każdego, kto zaczyna się w Haskell. Jeśli masz problemy, sprawdź tabulacje i spacje w kodzie źródłowym.

Odpowiedz

25

return jest funkcją (przeciążoną) i nie oczekuje, że jej pierwszy argument będzie słowem kluczowym. Można brać w nawias:

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

lub użyj poręczny operatora aplikacji ($):

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

Stylewise, że złamię ją na inną funkcję:

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

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

ale ty nadal potrzebna jest parentessize lub use ($), ponieważ return przyjmuje jeden argument, a aplikacja funkcji jest najwyższym priorytetem.

+0

Myślałem, że wypróbowałem obie te opcje. Zanim wyślę pytania. Głupi mnie. Dzięki – Ted

10

Równoważnie:

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

To chyba lepsze zrobić jak wnoise sugeruje, ale może to komuś pomóc zrozumieć nieco lepiej.

+0

Metoda ta ładnie podkreśla pierwszorzędny charakter działań IO. – wnoise

Powiązane problemy