2010-06-28 29 views
5

Chcę moja funkcja showStackHead wziąć stos wydrukować głowę i powrót resztki, tutaj jest mój kod --codejak napisać powrócić Haskell

showStackHead xx 
       | xx == [] = return [] 
       | otherwise = do putStrLn("result:" ++ (head xx)) 
           return (tail xx) 

kiedy uruchomić ten kod, kompilator mówi mi tam jest błędem parsowania na temat drugiego powrotu, więc jaki jest właściwy sposób napisania tej funkcji?

Odpowiedz

15

wcięcie do „powrotu” do tej samej głębokości jak „putStrLn”, tak jak poniżej:

showStackHead xs 
    | xs == [] = return [] 
    | otherwise = do putStrLn ("result:" ++ (head xs)) 
        return (tail xs) 
+3

przeczytaj o "układzie" w tutorialu Haskell 98 – bandi

2

Tak na marginesie, twój showStackHead mogłyby być czystsze za pomocą dopasowywania wzorców. Pozwolić ci na porzucenie porównania strażnika, głowy i ogona:

#! /usr/bin/env runhaskell 


showStackHead []  = return [] 
showStackHead (x:xs) = do 
    putStrLn $ "result: " ++ [x] 
    return xs 


main :: IO() 
main = do 
    let s1 = [] 
    r1 <- showStackHead s1 
    putStrLn $ "returned: " ++ r1 

    putStrLn "---" 

    let s2 = "foo" 
    r2 <- showStackHead s2 
    putStrLn $ "returned: " ++ r2 

    putStrLn "---" 

    let s3 = "q" 
    r3 <- showStackHead s3 
    putStrLn $ "returned: " ++ r3