2010-06-28 16 views
5

volver Quiero que mi función showStackHead tomar una pila imprimir la cabeza y devolver los restos, aquí está mi código --codecómo escribir Haskell

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

cuando corro este código, el compilador me dice que hay es un error de análisis sobre la segunda devolución, entonces, ¿cuál es la forma correcta de escribir esta función?

Respuesta

15

sangría del 'retorno' a la misma profundidad que 'putStrLn', así:

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

lea acerca de "diseño" en el tutorial de Haskell 98 – bandi

2

Como acotación al margen, su showStackHead podría estar más limpio mediante el uso de la coincidencia de patrones. Permitiéndole anular la comparación de guardia, cabeza y cola:

#! /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 
Cuestiones relacionadas